所以我有类老师的收藏。 要了解我的问题,就必须了解我的数据库。 结构是
const TeacherSchema = new Schema(
{
name: {
type: String,
required: true
},
email: {
type: String,
required: true
},
role: {
type: String,
default: "teacher"
},
userid: {
type: String,
required: true
},
password: {
type: String,
required: true
},
profileImage: {
type: String,
required: false
},
classes: [{
type:Schema.Types.ObjectId,
ref:'class'
}]//1 teacher will have multiple classes
},
{ timestamps: true }
);
和类:
const ClassSchema = new Schema(
{
subject: {
type: String,
required: true
},
teacher:[{
type:Schema.Types.ObjectId,
ref: 'teacher'
}],//once class will have only one teacher
},
{ timestamps: true }
);
我想做的是,我想让老师看看他/她有多少类。 这是我的控制器。
exports.getAllClass= async (req, res, next) => {
let teacherClasses
try{
teacherClasses= await Teacher.findById(req.params.id)//teacher database
arrayOfClass= teacherClasses.classes //getting the class it has array of objectID
arrayOfClass.forEach(async (classes)=>{
let classDB =await Class.findById(classes)
console.log(classDB.subject)// in the console it shows all the classes.
return res.status(200).json({
'name':classDB.subject //but here it only shows one class,the first class name
})
});
}catch(err){
console.log(err)
}
}
我试过很多东西,但找不到一个合适的解决办法。 你能告诉我在这里我做错了什么或者有什么更好的方法吗? 我想在回归中展示所有的类。 我是编程新手,因此被分配到复杂的任务中,请帮助我。
您正在对ArrayOfClass
使用foreach
,并在该foreach
中返回和发送响应。 因此,一旦第一个承诺被解决,响应就被发送。
一种简单的方法是使用。 f
循环,等待每个类
-promise内部,并跟踪每个结果。 一旦完成,您就可以发送响应:
...
const classes = [];
for(const classId of arrayofClass) {
const classDB = await Class.findById(classId);
classes.push({ name: classDB.subject });
}
return res.json(classes);
另一种实现此目的的方法是使用promise.all()
,如果处理较大的数据集时是并行处理,而第一个解决方案是按顺序处理的,那么使用promise.all()
可能更好:
...
const classPromises = await Promise.all(arrayofClass.map(classId => Class.findById(classId)));
const result = classPromises.map(classDB => ({
name: classDB.subject
}));
return res.json(result);