[英]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.