【问题标题】:How to only execute the res.redirect after the for() loop ends如何仅在 for() 循环结束后执行 res.redirect
【发布时间】:2022-11-22 04:23:52
【问题描述】:

我有以下邮寄路线:

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() 循环尝试多次重定向,我收到以下错误:

错误 [ERR_HTTP_HEADERS_SENT]:发送后无法设置标头 给客户

该路线有效。更新是在数据库中进行的,但由于这个错误,我每次都需要重新启动节点。 我需要 for() 循环来遍历“listaAprovadores”数组中的对象。

也许异步函数可以解决问题,但我是 JavaScript 和 Node.js 的新手。 我能做些什么?

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    你的代码有问题

    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')
      }
    })
    

    或者使用异步/等待

    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)
      }
    })
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-06
      • 2017-10-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多