在 Node.js 中处理多个异步操作

伊莎贝拉

我们正在尝试遍历作为数组发布到端点的所有协作者,并将它们推送到 collaboratorsArray。我们不希望函数 saveProject 在 forEach 循环完成之前执行。

我们目前得到的结果是 saveProject 没有等待,因此在保存项目时 collaboratorsArray 是一个空数组。

请注意,我们都是 Node.js 和 Promise 的新手。我们非常感谢您的任何建议!

这是我们的代码

export const newProject = async (req, res) => {
  const { userID } = req.params
  const { name, description, collaborators } = req.body

  let collaboratorsArray = []

  const loopCollaborators = async () => {
    if (collaborators) { 
      return new Promise((resolve, reject) => {
        collaborators.forEach(async username => {      
          const collaborator = await User.findOne({
            username
          })
          collaboratorsArray.push(collaborator)
          console.log('CollaboratorsArray ', collaboratorsArray)
        })
          resolve(collaboratorsArray)
      })
    }
  }

  const saveProject = async () => {
    const getCollaboratorsProject = await loopCollaborators()

    if (getCollaboratorsProject) {
      try {
        console.log('Project save now', collaboratorsArray)
        const project = await new Project({
          name,
          description,
          collaborators: collaboratorsArray,
          projectOwner: userID
        }).save()
    
        res.status(201).json({ 
          success: true,
          projectID: project._id,
          name: project.name, 
          description: project.description,
          collaborators: project.collaborators,
          projectOwner: project.projectOwner
        })
      } catch (error) {
        res.status(400).json({ success: false, message: 'Invalid request', error })
      }
    }
  }
  saveProject()
}

这是我们的模型

export const Project = mongoose.model('Project', {
  name: {
    type: String,
    required: true,
    maxlength: 20
  },
  description: {
    type: String
  },
  collaborators: {
    type: Array
  }, 
  projectOwner: {
    type: String,
    required: true
  }
})
只是

不要使用Array.forEach循环 with asycn/await,使用传统for循环。为什么 ?查看更多在 forEach 循环中使用 async/await

async function newProject(req, res) {
    try {
        let { userID } = req.params,
            { name, description, collaborators } = req.body,
            collaboratorsArray = [];

        if (!collaborators) return

        for (const username of collaborators) {
            const collaborator = await User.findOne({ username });
            collaboratorsArray.push(collaborator);
        }

        console.log('CollaboratorsArray ', collaboratorsArray);

        const project = await new Project({
            name, description,
            collaborators: collaboratorsArray,
            projectOwner: userID
        }).save();

        res.status(201).json({
            success: true,
            projectID: project._id,
            name: project.name,
            description: project.description,
            collaborators: project.collaborators,
            projectOwner: project.projectOwner
        });

    } catch (error) {
        res.status(400).json({ success: false, message: 'Invalid request', error })
    }
}

我认为 Express.js 会为你处理错误,所以你不需要try/catch在每个请求处理程序中使用块!,在 express 中使用全局错误处理程序......

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章