简体   繁体   English

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

[英]How to only execute the res.redirect after the for() loop ends

I have the following post route:我有以下邮寄路线:

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

I get the following error because of the for() loop trying to redirect multiple times:由于 for() 循环尝试多次重定向,我收到以下错误:

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头

The route works.该路线有效。 The update is made in the database, but i need to restart Node every time because of this error.更新是在数据库中进行的,但由于这个错误,我每次都需要重新启动节点。 I need the for() loop to iterate over the objects inside "listaAprovadores" array.我需要 for() 循环来遍历“listaAprovadores”数组中的对象。

Maybe async functions do the trick, but i'm new to JavaScript and Node.也许异步函数可以解决问题,但我是 JavaScript 和 Node.js 的新手。 What can i do?我能做什么?

Issues with your code你的代码有问题

1- you're using updateMany to update one element, use updateOne 1-你正在使用updateMany来更新一个元素,使用updateOne

2- trying to send response in a for loop which is incorrect 2- 试图在不正确的 for 循环中发送响应

3- an advice: don't use callbacks use either promises or async/await (which is another syntax for promises) 3- 建议:不要使用回调,使用 promises 或 async/await(这是 promises 的另一种语法)

try the following尝试以下

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

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM