Node.js API为相同的请求返回不同的值

我正在学习使用Node.js + Express来构build一个REST API。 在这个API中,我有以下方法:

apiRouter.route('/training/session/byId/:id_session') // ===== GET ======= .get(function(req, res) { //Get the session Session.findById(req.params.id_session, function(err, session) { //Get an array of exercise associated with the session Exercise.find({session: session._id}, function(err, exercise) { let movements = []; let sets = []; let i = exercise.length-1; //For every exercise get the movements and the sets exercise.forEach(function (ex,index) { Movement.findById(ex.movement,function(err,movement){ if(movement) movements.push(movement); //***** Here? Set.find({exercise: ex}, function (err, set) { if(set.length) sets.push(set); if(index == i){ res.json({ message: 'ok' ,session,exercise,movements,sets}); } }) }) }) }); }); }) 

这个想法是从数据库中获取所有与会话相关的信息。

首先:我认为这不是正确的方式来创build多个查询,并返回一个对象与所有querys的信息,但我是新手与asynchronous工作的节点…那么是什么正确的方法来做多个查询一个查询的数据依赖于其他查询?

第二:在前端(React + Redux)我使用axios进行Ajax请求,并且对于相同的Ajax请求,有时候并不是所有的“sets”都被提取(// ***** Here?)。 问题是在API中?

提前致谢。

编辑:数据库模型

会议:

 var SessionSchema = new Schema({ date: {type: Date, default: Date.now }, time: Number, //Time in seconds user: {required: true, type: mongoose.Schema.Types.ObjectId, ref: 'User'}, }); 

行使:

 var ExerciseSchema = new Schema({ session: {type: mongoose.Schema.Types.ObjectId, ref: 'Session'}, movement: {type: mongoose.Schema.Types.ObjectId, ref: 'Movement'}, timestamp: { type: Date, default: Date.now } }); 

组:

 var SetSchema = new Schema({ repetitions: Number, weight: Number, rest: Number, timestamp: { type: Date, default: Date.now }, exercise : {type: mongoose.Schema.Types.ObjectId, ref: 'Exercise'} }); 

运动:

 var MovementSchema = new Schema({ name: { type: String, required: true, index: true, unique: true }, material:{ type: String, required: true}, muscles : [{ name : { type: String, required: true}, percentage : { type: Number, required: true} }] }); 

 Set.find({exercise: ex}, function (err, set) { if(set.length) sets.push(set); }).then(function(set){ if(index == i){ res.json({ message: 'ok' ,session,exercise,movements,sets}); } }) 

当然,我以前的答案是行不通的。 设置的查询callback将在if(index == i)之后执行。 其实我不确定这会从你的代码产生不同的结果。 我从来没有真正使用mongoose,但据我所知,你不能做连接,所以嵌套查询是做到这一点。

你可能要考虑使用承诺。 不是必须的,但是它们让你的代码更易于阅读和思考: http : //eddywashere.com/blog/switching-out-callbacks-with-promises-in-mongoose/

创build查询返回时build立的单个结果对象可能更有意义,因此您最终将发送一个表示会话的单个JSON对象,如下所示:

 { exercises: [ { sets: [], movements: [], }, { sets: [], movements: [], }, ... ] }