forEach块外的Javascript未执行

时间:2017-03-18 10:21:01

标签: javascript express mongoose ecmascript-6

我正在使用Javascript(ES6)开发Restful API。对于下面的代码片段,我有两个表Lecturer和Course。我正在尝试发送特定讲师所有的课程。

api.get('/getCourses/:lecturer_id', (req, res) => { 
    let myCourses = [];
    let send = true;
    Lecturer.findById(req.params.lecturer_id, (err, lecturer) => {
      if(err) {
        res.json({ ok : '0'});
      } else {
        lecturer.courses.forEach(value => {
          Course.findById(value, (err, course) => {
            console.log(value);
            if(err) {
              res.json({ok : '0'});
              send = false;
            } else {
              console.log('in else');
              console.log(course)
              myCourses.push(course);
              console.log(myCourses.length);
            }
            console.log(myCourses.length);
          });
          console.log('outside1');
        });
        console.log('outside');
        res.json(myCourses);
      }
    });
  });

但是在这里,在控制台“outside1”和“outside”都没有打印出来。结果,“myCourses”数组返回空。你能解释一下我的问题吗?谢谢。

2 个答案:

答案 0 :(得分:0)

我建议你使用承诺,而不是做你做过的事情。请参阅以下代码。它正在做着你正在做的事情,但是以一种非常清洁和优雅的方式。

api.get('/getCourses/:lecturer_id', (req, res) => { 
    let myCourses = [];
    let send = true;
    Lecturer.findById(req.params.lecturer_id, (err, lecturer) => {
      if(err) {
        res.json({ ok : '0'});
      } else {

        Promise.all(lecturer.courses.map(function(value){
          return Course.findById(value).exec();
        })).then(function(allCourses){
          //allCourses is array of courses
          res.json(allCourses);
        }).catch(function(err){
          //error happened while fetching courses
        })
      }
    });
  });

答案 1 :(得分:0)

我已经尝试过您的代码了,而且它正在运行。你是如何定义模型的?我看起来像这样:

// Lecturer
const mongoose = require('mongoose');

const lecturerSchema = new mongoose.Schema({
  id: { type: 'ObjectId', unique: true },
  courses: [ { type: 'ObjectId', ref: 'Course' } ]
});

const Lecturer = mongoose.model('Lecturer', lecturerSchema);

module.exports = Lecturer;

// Course
const mongoose = require('mongoose');

const courseSchema = new mongoose.Schema({
  id: { type: 'ObjectId', unique: true }
});

const Course = mongoose.model('Course', courseSchema);

module.exports = Course;

一些额外的评论:

  • 您可以使用Course.find({ '_id': { $in: lecturer.courses } })
  • 搜索课程
  • 在实际使用之前验证:lecturer_id
  • 检查您是否收到任何搜索结果,因为lecturer可以是null
  • 查看Mongoose Promises