Node.js 无法发送结果错误:发送到客户端后无法设置标头
我正在发送更新的结果。文档正在更新,但我无法发送结果。陷入此错误 我使用了Node.js 无法发送结果错误:发送到客户端后无法设置标头,node.js,express,mongoose,Node.js,Express,Mongoose,我正在发送更新的结果。文档正在更新,但我无法发送结果。陷入此错误 我使用了承诺而且我也得到了几乎相同的错误。 先谢谢你 这就是我想要的 exports.updateMany = (req, res) => { req.body.forEach((item) => { console.log("item:", item) Note.updateMany({ _id: item.id }, { $set: {
承诺
而且我也得到了几乎相同的错误。
先谢谢你
这就是我想要的
exports.updateMany = (req, res) => {
req.body.forEach((item) => {
console.log("item:", item)
Note.updateMany({ _id: item.id }, {
$set: {
lname: item.name,
age: item.age
}
}, { upsert: true },
(err, task) => {
if (err) {
res.send(err);
}
return res.send(task)
}
);
})
这就是我得到的错误
item: { id: '5d68c4e15269f90c08a99e79', name: 'aadg', age: 45 }
item: { id: '5d68c8aab5d7031a68235a3e', name: 'safew', age: 43 }
events.js:180
throw er; // Unhandled 'error' event
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
←[90m at ServerResponse.setHeader (_http_outgoing.js:464:11)←[39m
at ServerResponse.header (C:\Users\test\mongo-data\example\node_modules\←[4mexpress←[24m\lib\response.js:771:10)
at ServerResponse.send (C:\Users\test\mongo-data\example\node_modules\←[4mexpress←[24m\lib\response.js:170:12)
at ServerResponse.json (C:\Users\test\mongo-data\example\node_modules\←[4mexpress←[24m\lib\response.js:267:15)
at ServerResponse.send (C:\Users\test\mongo-data\example\node_modules\←[4mexpress←[24m\lib\response.js:158:21)
at C:\Users\test\mongo-data\example\app\controllers\note.controllers.js:129:28
at C:\Users\test\mongo-data\example\node_modules\←[4mmongoose←[24m\lib\model.js:4581:16
at model.Query.callback (C:\Users\test\mongo-data\example\node_modules\←[4mmongoose←[24m\lib\query.js:4080:9)
at C:\Users\test\mongo-data\example\node_modules\←[4mkareem←[24m\index.js:315:21
at C:\Users\test\mongo-data\example\node_modules\←[4mkareem←[24m\index.js:135:16
←[90m at processTicksAndRejections (internal/process/task_queues.js:75:11)←[39m
Emitted 'error' event at:
at C:\Users\test\mongo-data\example\node_modules\←[4mmongoose←[24m\lib\model.js:4583:13
at model.Query.callback (C:\Users\test\mongo-data\example\node_modules\←[4mmongoose←[24m\lib\query.js:4080:9)
[... lines matching original stack trace ...]
←[90m at processTicksAndRejections (internal/process/task_queues.js:75:11)←[39m
[nodemon] app crashed - waiting for file changes before starting...
问题在于,您在主体的项目上运行的是
foreach
。
因此,第一个项目经过并发送响应(在return res.send(task)
上),然后在第二个项目上,您会得到异常,因为您只能发送一次响应
您应该首先处理所有项目,然后只发送一次响应问题是您在主体项目上运行的是
foreach
。
因此,第一个项目经过并发送响应(在return res.send(task)
上),然后在第二个项目上,您会得到异常,因为您只能发送一次响应
您应该首先处理所有项目,然后只发送一次响应添加一个简单的计数器,它将帮助您在所有操作完成后发送响应。您可以稍后检查承诺和异步等待语法,以便以更好的方式执行此类操作:
exports.updateMany = (req, res) => {
var counter = 0
var totalModified = 0
req.body.forEach((item, index) => {
console.log("item:", item)
Note.updateMany({ _id: item.id }, {
$set: {
lname: item.name,
age: item.age
}
}, { upsert: true },
(err, task) => {
counter++
if (err) {
index = req.body.length
res.send(err);
}
totalModified += task.nModified || 0
if(counter === req.body.length)
return res.send({totalModified})
}
);
})
}
添加一个简单的计数器,它将帮助您在所有操作完成后发送响应。您可以稍后检查承诺和异步等待语法,以便以更好的方式执行此类操作:
exports.updateMany = (req, res) => {
var counter = 0
var totalModified = 0
req.body.forEach((item, index) => {
console.log("item:", item)
Note.updateMany({ _id: item.id }, {
$set: {
lname: item.name,
age: item.age
}
}, { upsert: true },
(err, task) => {
counter++
if (err) {
index = req.body.length
res.send(err);
}
totalModified += task.nModified || 0
if(counter === req.body.length)
return res.send({totalModified})
}
);
})
}
使用
foreach
是否可能在最后得到响应,因为如果我不提供(回调函数(err,task)
)升级将不会发生。如何完成。可能将获取一个项目的updateMany函数替换为获取整个列表、处理所有项目并随后返回承诺的函数。使用foreach
是否有可能在最后获得响应,因为如果我不提供(回调函数(err,task)
)更新将不会发生。如何做到这一点。可能将获取一个项目的函数替换为获取整个列表、处理所有项目并随后返回承诺的函数。如果总长度为六个,而我只更新了三个特定文档,那么结果将不会被视为例外。我尝试了你的修改,并且(如果我修改了两个ID,它将显示nmodified:1
)我尝试发送计数器,我得到了一些issues@manjesha在推送到响应数组之前,您仍然可以检查nModified
值。应该行得通。谢谢你的解决方案。因为每次整个任务都存储在响应中
,所以还有其他方法吗。是否可以增加每个任务的nModified
值。@manjesha您的意思是-您想发送修改记录的总数作为响应?yes
。每次nmodied number都应该增加如果总长度为6,并且我只更新了三个特定文档,那么结果将不会像预期的那样。我尝试了你的修改,并且(如果我修改了两个ID,它将显示nmodified:1
)我尝试发送计数器,我得到了一些issues@manjesha在推送到响应数组之前,您仍然可以检查nModified
值。应该行得通。谢谢你的解决方案。因为每次整个任务都存储在响应中
,所以还有其他方法吗。是否可以增加每个任务的nModified
值。@manjesha您的意思是-您想发送修改记录的总数作为响应?yes
。每次nModifeid数都应增加