当数据存在于MongoDB中时,返回空数组的API

所有。 我是一个初学者,试图用Express后端构build一个React应用程序。 我已经构build了一个从MongoDB获取数据的API。 这里是Robo3T所示的MongoDB内部的数据。 我的问题是,数据包含选项数组似乎在MongoDB中显示数据(使用Robo3T),但选项数组在API响应中为空。

数据如Robo3T所示

API响应如下:

[ { _id: "5a21536a70ef53552d30e709", q_text: " ¿Cuál es tu edad, sexo y lugar de nacimiento?", options: [ ] }, { _id: "5a21536a70ef53552d30e70a", q_text: "¿Actualmente asistes a la escuela?", options: [ ] }, { _id: "5a21536a70ef53552d30e70b", q_text: "¿Cuál es tu grado de estudios? (grado y programa)", options: [ ] } ] 

Server.js

 //importing all dependencies var express = require('express'); var bodyParser = require('body-parser'); var mongoose = require('mongoose'); var Question = require('./models/Question'); //Connecting to MongoDB server mongoose.connect('mongodb://localhost/local', {useMongoClient: true}); var db = mongoose.connection; db.on('error', console.error.bind(console, 'MongoDB connection error')); //Creating our Express App Instance var app = express(); var router = express.Router(); //Specifying the port number var port = process.env.PORT || 3001; //Configuring body-parser app.use(bodyParser.json()); app.use(bodyParser.urlencoded({extended: true})); //To prevent errors from Cross Origin Resource Sharing, we will set our headers to allow CORS with middleware like so: app.use(function(req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Credentials', 'true'); res.setHeader('Access-Control-Allow-Methods', 'GET,HEAD,OPTIONS,POST,PUT,DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers'); //and remove cacheing so we get the most recent comments res.setHeader('Cache-Control', 'no-cache'); next(); }); router.get('/', function(req, res){ res.json({message : 'API initialized'}); }) router.route('/questions') //retrieve all questions from database .get(function(req, res){ Question.find({}, function(err, questions){ if(err){ res.status(500).send({error: 'Could not fetch Questions'}); } else{ res.json(questions); } }) }) app.use('/api', router); //start the server and listen for requests app.listen(port, function(){ console.log(`Server listening on port ${port}`); }) 

车型/ Question.js

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; var ObjectId = mongoose.Schema.Types.ObjectId; var question = new Schema({ q_text:String, options:[{ type: String, o_text: String }] }); module.exports = mongoose.model('Question',question); 

从./components/App.jsx访问数据

 import React, {Component} from 'react'; import axios from 'axios'; import Question from './Question'; class App extends Component{ constructor(props){ super(props); this.state = { dataLoaded: false, questions: [] }; this.loadQuestions = this.loadQuestions.bind(this); } loadQuestions(){ axios.get(this.props.url) .then(res => { this.setState({questions: res.data}); this.setState({dataLoaded: true}) }) } componentDidMount(){ this.loadQuestions(); } render(){ if(this.state.dataLoaded){ console.log(this.state.questions[2].options); return( <div> <Question text={this.state.questions[1].q_text}/> </div> ) } else{ return( <div>Loading...</div> ); } } } export default App; 

mongo db中的集合名称是什么? 这是问题吗? 默认情况下,如果在定义模式时没有提供集合名称,如果你没有提供集合名称,mongoose将复数模式名称,在你的情况下问题。 您可以使用var schema = new Schema({..},{collection:'question'})来覆盖此行为。