提问者:小点点

Express:return未在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)
    }
  }

我试过很多东西,但找不到一个合适的解决办法。 你能告诉我在这里我做错了什么或者有什么更好的方法吗? 我想在回归中展示所有的类。 我是编程新手,因此被分配到复杂的任务中,请帮助我。


共1个答案

匿名用户

您正在对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);