mongodb 如何只在for()循环结束后执行res.redirect

c9x0cxw0  于 2022-11-22  发布在  Go
关注(0)|答案(1)|浏览(135)

我有以下的邮政路线:

app.post("/respostaAprovChamado", function(req, res){
    if(req.isAuthenticated()){
      for(let i = 0; i < req.body.indiceAprov; i++){
        Chamado.updateMany(
          {"_id": req.body.idChamadoPost, ["listaAprovadores." + i + ".nome"]: req.user.realNome},
          {
            $set: {["listaAprovadores." + i]: [{nome: req.user.realNome}, {status: req.body.respostaAprov}]}
          },
          {
              returnNewDocument: true
          }
      , function( error, result){
        if(error){
          res.send(error)
        } else{
          res.redirect('/aprovChamados')
        }
      })};
    }else{
      res.redirect('/login')
    }
})

由于for()循环多次尝试重定向,因此出现以下错误:
错误[错误_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头
路由工作。更新是在数据库中进行的,但由于这个错误,我每次都需要重新启动节点。我需要for()循环来迭代“listaAprovadores”数组中的对象。
也许异步函数可以,但是我对JavaScript和Node还不熟悉,我能做些什么呢?

2lpgd968

2lpgd9681#

代码问题
1-如果要使用updateMany更新一个元素,请使用updateOne
2-尝试在不正确的for循环中发送响应
3-建议:不要使用promises或async/await(promises另一种语法)回调
请尝试以下操作

app.post("/respostaAprovChamado", function (req, res) {
  if (req.isAuthenticated()) {
    const updatePromises = [];
    for (let i = 0; i < req.body.indiceAprov; i++) {
      updatePromises.push(Chamado.updateOne(
        { "_id": req.body.idChamadoPost, ["listaAprovadores." + i + ".nome"]: req.user.realNome },
        {
          $set: { ["listaAprovadores." + i]: [{ nome: req.user.realNome }, { status: req.body.respostaAprov }] }
        },
        {
          returnNewDocument: true
        }))
    };
    Promise.all(updatePromises)
      .then(result => res.redirect('/aprovChamados'))
      .catch(error => res.send(error))
  } else {
    return res.redirect('/login')
  }
})

或使用async/await

app.post("/respostaAprovChamado", async function (req, res) {
  try {
    if (req.isAuthenticated()) {
      const updatePromises = [];
      for (let i = 0; i < req.body.indiceAprov; i++) {
        updatePromises.push(Chamado.updateOne(
          { "_id": req.body.idChamadoPost, ["listaAprovadores." + i + ".nome"]: req.user.realNome },
          {
            $set: { ["listaAprovadores." + i]: [{ nome: req.user.realNome }, { status: req.body.respostaAprov }] }
          },
          {
            returnNewDocument: true
          }))
      };
      await Promise.all(updatePromises)
      return res.redirect('/aprovChamados')
    } else {
      return res.redirect('/login')
    }
  } catch (error) {
    return res.send(error)
  }
})

相关问题