【问题标题】:Error in function to update an user [node.js]更新用户的功能出错 [node.js]
【发布时间】:2021-10-18 03:13:23
【问题描述】:

当我尝试使用邮递员更新用户的简历时出现错误。我使用 mongoDB 作为数据库。当我尝试在响应中发送文档时看起来这是一个问题,但我不知道如何解决它

这是 userController 的代码不起作用:

module.exports.updateUser = async (req, res) => {
    if (!ObjectId.isValid(req.params.id))
      return res.status(404).send("ID unknown : " + req.params.id);
  
    try {
      await UserModel.findOneAndUpdate(
        { _id: req.params.id },
        {
          $set: {
            bio: req.body.bio,
          },
        },
        { new: true, upsert: true, setDefaultsOnInsert: true },
        (err, docs) => {
            console.log(docs);
            if (!err) return res.send(docs);
            else return res.status(500).json({ message: err });
        }
      );
    } catch (err) {
      return res.status(500).json({ message: err });
    }
};

而且报错如下:

node:events:371
      throw er; // Unhandled 'error' event
      ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:371:5)
    at ServerResponse.setHeader (node:_http_outgoing:573:11)
    at ServerResponse.header (/home/pt/Documents/back_sport_app/api/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/home/pt/Documents/back_sport_app/api/node_modules/express/lib/response.js:170:12)
    at ServerResponse.json (/home/pt/Documents/back_sport_app/api/node_modules/express/lib/response.js:267:15)
    at ServerResponse.send (/home/pt/Documents/back_sport_app/api/node_modules/express/lib/response.js:158:21)
    at /home/pt/Documents/back_sport_app/api/controllers/userController.js:36:34
    at /home/pt/Documents/back_sport_app/api/node_modules/mongoose/lib/model.js:4923:18
    at processTicksAndRejections (node:internal/process/task_queues:78:11)
Emitted 'error' event on Function instance at:
    at /home/pt/Documents/back_sport_app/api/node_modules/mongoose/lib/model.js:4925:15
    at processTicksAndRejections (node:internal/process/task_queues:78:11) {
  code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...

【问题讨论】:

  • 你是如何使用这个的?看起来它在设置标头之前正在运行。
  • 这一行是什么? userController.js:36:34
  • @AdarshMohan 在这一行有(err, docs) => {console.log(docs); if (!err) return res.send(docs);
  • @DaveNewton 我将它用作控制器,以便能够在 router.put (/: id) 路由上更新用户的个人资料,但究竟什么是标头?
  • 这种情况下是在设置响应状态码时出错。在请求已经完成后发送响应时会发生错误。示例 - 执行此操作 - ` res.end() // 或 res.send()` 然后执行此操作 - res.send() // sending the response again causes the above error.

标签: javascript node.js mongodb mongoose


【解决方案1】:

您正在回调函数中发送响应,但响应已在 promise 解析后立即发送(等待)。

尝试使用 -

module.exports.updateUser = async (req, res) => {
   if (!ObjectId.isValid(req.params.id))
     return res.status(404).send("ID unknown : " + req.params.id);
 
   try {
      const docs = await new Promise((resolve, reject) => {
         UserModel.findOneAndUpdate(
            { _id: req.params.id },
            {
               $set: {
               bio: req.body.bio,
               },
            },
            { new: true, upsert: true, setDefaultsOnInsert: true },
            (err, docs) => {
               if (err) {
                  reject(err)
               } else {
                  console.log(docs);
                  resolve(docs)  // resolving the promise with docs, instead of sending the response.
               }
            }
         );
      })

      return res.send(docs);  // sending response after the above promise is resolved.
   } catch (err) {
     return res.status(500).json({ message: err });
   }
};

【讨论】:

  • 感谢它的工作原理!
猜你喜欢
  • 2021-12-15
  • 2017-04-26
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 2016-12-20
相关资源
最近更新 更多