我正在使用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”数组返回空。你能解释一下我的问题吗?谢谢。
答案 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