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



我有以下邮件路线:

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

Error [ERR_HTTP_HEADERS_SENT]:发送后不能设置报头给客户端

路由正常。更新是在数据库中进行的,但由于此错误,我每次都需要重新启动Node。我需要for()循环来遍历listaprovadores"数组。

也许异步函数做的伎俩,但我是新的JavaScript和Node。我能做什么?

代码问题

1-您使用updateMany更新一个元素,使用updateOne

2-尝试在for循环中发送响应,这是不正确的

3-一个建议:不要使用回调,使用承诺或async/await(这是承诺的另一种语法)

试试下面的

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

最新更新