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数都应增加