javascript - 在我的例子中,foreach 中的 Mongoose promise 失败了

标签 javascript node.js mongodb mongoose

如何使用 forEach 进行 Promise?我想要获取所有工作,但获取申请人的数据。我的工作模式已经有申请人 ID,但如何查询用户并将其详细信息合并到输出中?

Job.find({}).then(result => {

  result.forEach(obj =>{
    const applicant_id = obj.applicant._id
    if(applicant_id){
        User.findOne({_id: applicant_id})
        .then(user=>{
          return res.json({
            status: 1,
            data: {
              ...obj,
              applicant: {
                ...user
              }
            }
          })
        })
    }
  })

}).catch(err => {
  if(err){
    return res.status(400).send({
      msg: err
    })
  }
})

我尝试了 Promise,但我无法将用户合并到 Job 对象中,

Job.find({}).then(result => {

  let promiseArray = []
  result.forEach(obj =>{
    const applicant_id = obj.applicant._id
    if(applicant_id){
      promiseArray.push(
        User.findOne({_id: applicant_id}))
    }
  })

  return Promise.all(promiseArray)

}).then(user => {

  console.log(user)
  //this work but this is only the user's data, 
  //I need it to be within obj which is Job data

})

最佳答案

您首先需要过滤结果中的项目以排除那些没有申请人 ID 的项目,然后将此数组映射到 Promise 数组,最后将其传递给 Promise.all。这应该可以做到:

Job.find({}).then(result => {
  const promises = result
    .filter(obj => obj.applicant._id)
    .map(obj => {
      const applicant_id = obj.applicant._id

      return User.findOne({ _id: applicant_id })
        .then(user => {
          return res.json({
            status: 1,
            data: {
              ...obj,
              applicant: {
                ...user
              }
            }
          })
        })
    })

  return Promise.all(promises)
}).catch(err => {
  if (err) {
    return res.status(400).send({
      msg: err
    })
  }
})

关于javascript - 在我的例子中,foreach 中的 Mongoose promise 失败了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48229969/

相关文章:

javascript - jQuery addClass 基于滚动距离

javascript - 在 MongoDB 中获取查询外的数据

mongodb - mongoDB实际上是如何工作的?

javascript - async.each 有问题,回调在完成任务之前被调用

javascript - 动态更改 MongoDB 查找结果

javascript - Mongoose:改进 find() 和 count() 查询

javascript - 如何使用 Javascript 检测文本区域中的新空行?

javascript - vue.js 使用计时器自动重新加载/刷新数据

javascript - 一个不会在刷新时重置的计时器

javascript - 获取类型错误 : Failed to execute 'fetch' on 'Window' : Illegal invocation