javascript - Express:返回未在 api 中显示数组
问题描述
所以我有老师,班级的集合。要了解我的问题,有必要了解我的数据库。结构是
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)
}
}
我尝试了很多事情,但无法找到合适的解决方案。你能告诉我我在这里做错了什么还是有更好的方法?我想在退货中显示所有课程。我是编程新手,因此分配了复杂的任务,请帮助我。
解决方案
您forEach
在返回并发送响应的arrayOfClass
范围内使用。forEach
因此,一旦第一个承诺得到解决,就会发送响应。
一种简单的方法是使用for .. of
循环并在内部等待每个class
-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()
which 可能更好,如果您正在处理更大的数据集,因为是并行处理,而第一个解决方案按顺序处理:
...
const classPromises = await Promise.all(arrayofClass.map(classId => Class.findById(classId)));
const result = classPromises.map(classDB => ({
name: classDB.subject
}));
return res.json(result);
推荐阅读
- google-my-business-api - 如何验证/测试具有 200 多个位置的 Google My Business API?
- php - 从我的 Magento 1.9 src 文件夹中删除 Install.php 是否安全?
- bootstrap-4 - Bootstrap 导出仅显示 CSV 选项
- android - Python EXIF 提取导致 Android 照片出错
- javascript - 如何在 select2 上调用 onclick 事件
- javascript - React/enzyme - How to test reference function
- java - Converting date object to yyyy-MM-dd hh:mm:ss
- jquery - Working with Jquery appended elements in MVC
- regex - 使用混合的单行和多行内容解析日志
- angular - 黄瓜 - 量角器不识别步骤定义