【问题标题】:Getting Mongo database values in forEach loop在 forEach 循环中获取 Mongo 数据库值
【发布时间】:2019-05-23 09:48:59
【问题描述】:

我有两个模式教师和学生

StudentSchema = new mongoose.Schema({
email:{type:String, index: {unique:true}}
name:{type:String},
marks:[{
subject:{type:String,
marks:{type:Number}
}]
})


TeacherSchema = new mongoose.Schema({
email:{type:String, index: {unique:true}}
name:{type:String},
students:[{
email:{type:String},
registerationDate:{type:Date}
}]
})

我有一个 API,我可以在其中获取教师的电子邮件 ID,并且必须回复该特定教师注册的学生的分数和姓名。

为此,我正在使用此代码

var teacher = await Teacher.findOne({"email":req.body.email})

teacher.students.forEach(function(students){
let student = Student.findOne({"email":students.email})
console.log(student)   // to watch the result
})

我想在我的学生变量中获取完整的学生模式,以便我可以使用学生的数据。

但我没有得到想要的输出,因为我无法与 Student.findOne 一起等待用户。

这样

let student = await Student.findOne({"email":students.email})

结果我得到了一个 Query 对象。

任何人都可以建议任何方式在循环中使用 await 或任何其他方式来获得我想要的输出吗?

如果我在循环中的任何地方使用 await,节点就会崩溃,因此在其他地方回答的在循环中使用 async/await 的解决方案并不能解决我的问题。

【问题讨论】:

  • @DragonBorn 我已经尝试了该帖子中人们回答的解决方案,但是如果我在循环中的任何地方使用 await ,节点就会崩溃,所以它不能解决我的问题。
  • 当它崩溃时你得到了什么错误,你使用for of而不是forEach
  • @DragonBorn 我收到了这个错误:TypeError: this.$__path is not a function
  • 您能否包含您在其他帖子中尝试过的代码,该代码给出了此错误。请包含从您的async 开始的整个函数。

标签: node.js mongodb express mongoose foreach


【解决方案1】:

您不能在 forEach 循环中使用 await。您必须改用for .. of 循环。

forEach 循环会触发多个异步请求,但之后函数会立即返回。它不会等待您的承诺解决,而 for .. of 循环会这样做。

将代码更改为:

for (let students of teacher.students) {
  let student = Student.findOne({"email":students.email})
  console.log(student)   // to watch the result
});

【讨论】:

    【解决方案2】:

    注意: Mongoose 查询没有本机同步 API,但您可以链接查询。

    试试这个;

    Teacher.findOne({"email":req.body.email}, (err, teacher)=>{
        if( !err ) {
          let studentEmailIds = [];
          teacher.students.forEach( (students) => {
              studentEmailIds.push(students.email);
          });
          Student.find({'email': {"$in": studentEmailIds } }, (err, students)=>{     
             if(err){
              //error handle
             }else{
              console.log(students)
              //res.json(students);
             }
          });
        }
    })
    

    【讨论】:

      【解决方案3】:

      你可以使用 mongoose 的 find 函数来代替 forEach,如下所示:

      teacher.find({}, function (err, teachers) {
        // now you can use teachers.forEach here for getting students
        console.log(teachers.students)
      });
      

      我想你是想让所有的老师都和他们的学生在一起。

      【讨论】:

      • 学生应该在老师里面,你能把debug放在评论的那一行,然后把老师里面的内容发给我吗。
      • 我不明白你在问哪一个,是我问题中的那个还是你答案中的那个?
      • 我的意思是试试我的答案,看看老师。 teacher.find({}, function (err, teacher) { // 现在你可以在这里使用 teacher.forEach 来获取学生 console.log(teachers.students) });
      • 节点崩溃,没有任何错误消息 [nodemon] app crashed - waiting for file changes before start...
      【解决方案4】:

      根据我对您问题的理解,这应该会有所帮助

      Teacher.find({}, (error, allTeachers) => {
        if (error) {
          // Handle Error
        } else {
          allTeachers.forEach(teacher=> {
            let student = Student.findOne({"email":teacher.email})
          });
        }
      })
      

      【讨论】:

      • 我的节点使用您的代码不断崩溃,而在 if 条件中没有显示错误消息。
      • 我犯了一个语法错误,现在已经修复了,你可以试试
      • 它仍然崩溃。
      • 我认为这是因为我使用了 teacher.findOne 而不是 Teacher.findOne。尝试改变它。另外,当它崩溃时你会得到什么错误?
      • 它没有显示任何错误它立即崩溃。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多