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

Javascript Node.js API为同一请求返回不同的值,javascript,ajax,node.js,express,reactjs,Javascript,Ajax,Node.js,Express,Reactjs,我正在学习使用Node.js+Express构建RESTAPI。在这个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) {

我正在学习使用Node.js+Express构建RESTAPI。在这个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});
              }
            })
          })
        })
      });
    });
  })
其思想是从数据库中获取所有与会话相关的信息

第一名: 我认为这不是创建多个查询并返回包含所有查询信息的对象的正确方法,但我对节点的异步工作还不是很熟悉。。。那么,在一个查询的数据依赖于另一个查询的情况下,进行多个查询的正确方法是什么呢

第二:在前端(React+Redux),我正在使用axios发出Ajax请求,对于同一个Ajax请求,有时并不是所有的“集合”都被获取(//******这里?)。问题出在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 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查询回调将在if(index==i)之后执行。实际上,我不确定这是否会产生与您的代码不同的结果。我从来没有实际使用过Mongoose,但据我所知,您不能进行连接,所以嵌套查询是实现这一点的方法

你可能想考虑使用承诺。没有必要,但它们使您的代码更易于阅读和思考:

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

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

不,这样做查询不会得到任何设置谢谢,在阅读了承诺之后,我正在重构代码以使用它。更清楚的是,移动和设置似乎不相关,所以明智的做法是不要嵌套这些查询。相反,尽可能多地进行并行查询,然后使用Promise.all().then()发送最终结果。
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});
    }
})
{
    exercises: [
                    {
                        sets: [],
                        movements: [],
                    },
                    {
                        sets: [],
                        movements: [],
                    },
                    ...
                ]
}