首页 > 解决方案 > 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)
    }
  }

我尝试了很多事情,但无法找到合适的解决方案。你能告诉我我在这里做错了什么还是有更好的方法?我想在退货中显示所有课程。我是编程新手,因此分配了复杂的任务,请帮助我。

标签: javascriptnode.jsexpressasync-await

解决方案


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);

推荐阅读