错误 [ERR_HTTP_HEADERS_SENT] 在将标头发送到客户端后无法设置标头

Posted

技术标签:

【中文标题】错误 [ERR_HTTP_HEADERS_SENT] 在将标头发送到客户端后无法设置标头【英文标题】:Error [ERR_HTTP_HEADERS_SENT] Cannot set headers after they are sent to the client 【发布时间】:2020-05-26 11:37:36 【问题描述】:
    at ServerResponse.setHeader (_http_outgoing.js:470:11)
    at ServerResponse.header (C:\root\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (C:\root\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\root\node_modules\express\lib\response.js:267:15)
    at ServerResponse.send (C:\root\node_modules\express\lib\response.js:158:21)
    at grade.save (C:\root\route\api\listsData.js:223:32)
    at C:\root\node_modules\mongoose\lib\model.js:4604:16
    at C:\root\node_modules\mongoose\lib\utils.js:268:11
    at $__save.error (C:\root\node_modules\mongoose\lib\model.js:472:16)
    at C:\root\node_modules\kareem\index.js:246:48
    at next (C:\root\node_modules\kareem\index.js:167:27)
    at next (C:\root\node_modules\kareem\index.js:169:9)
    at Kareem.execPost (C:\root\node_modules\kareem\index.js:217:3)
    at _handleWrapError (C:\root\node_modules\kareem\index.js:245:21)
    at C:\root\node_modules\kareem\index.js:272:14
    at _next (C:\root\node_modules\kareem\index.js:94:14)
Emitted 'error' event at:

请帮忙,我已经面临这个问题将近 3 天了,下面是我的后端 nodejs 代码: 等级模型

const mongoose = require('mongoose');

const GradeSchema = new mongoose.Schema(
  name: 
    type: String,
    maxlength: 100,
    required: true,
    unique: true
  
)

module.exports = Grade = mongoose.model('Grade', GradeSchema);

AddGradeRoute

  '/add/grade',
  [
    check('name', 'grade name is require')
      .not()
      .isEmpty()
  ],
  auth,
  admin,
  (req, res) => 
    const errors = validationResult(req);
    if (!errors.isEmpty()) res.status(400).send( errors: errors.array() );

    const grade = new Grade(req.body);

    grade.save((err, doc) => 
      if (err) res.status(400).send( success: false, err );
      return res.status(200).send(
        success: true,
        grade: doc,
        msg: 'Grade add successfully'
      );
    );
  
);

问题是当我尝试使用发布请求添加等级时,它工作正常,但如果我输入空白字段并再次发送请求,应用程序崩溃并返回上面的错误“发送后无法设置标题”给客户”。谢谢。

【问题讨论】:

响应发送到客户端后,您将无法发送标头。因此,当所有回调都执行时,只发送一次响应。那应该可以。 为了详细说明 Raja 的评论,您的代码中有多个 res.status().send 在某些错误情况下一个接一个地执行。确保在每个 res.status().send 事件之后 return 以确保只有其中一个被执行。 是的,谢谢您的意见,它对我帮助很大。我很感激。 【参考方案1】:

一旦发生错误,您需要返回错误响应,否则即使发生错误,您的函数仍将继续运行并执行以下代码。

  '/add/grade',
  [
   check('name', 'grade name is require')
  .not()
  .isEmpty()
],
auth,
admin,
(req, res) => 
const errors = validationResult(req);
if (!errors.isEmpty()) return res.status(400).send( errors: errors.array() );

const grade = new Grade(req.body);

grade.save((err, doc) => 
  if (err) return res.status(400).send( success: false, err );
  return res.status(200).send(
    success: true,
    grade: doc,
    msg: 'Grade add successfully'
  );
);

);

因为如果发生错误或任何验证失败,API 会发送响应但不会返回,因此函数会继续运行并执行其下方的所有其他代码。

您应该知道,在 HTTP 请求中,响应只能发送一次,并且当函数在错误后再次发送响应时,它会显示您在将响应标头发送到客户端后无法发送它们。

希望这会有所帮助。祝你好运:)

【讨论】:

是的,谢谢您的意见,我会再次尝试检查。我很感激。【参考方案2】:

当您发送多次会产生错误时,您只能向客户端发送一次响应

[ERR_HTTP_HEADERS_SENT] 标头发送到 客户

我遇到了同样的错误。就我而言,我发送了两次回复。 1)在保存用户之前。

res.send(user);//<----after removing this statement my problem was fixed.

2)保存用户后

await user.save().then(result=>
       return res.send(result);
        
    ).catch(err=>
        return res.sendStatus(500).send(
            message:err.message|| "some error occured"
        );
        
    )

【讨论】:

以上是关于错误 [ERR_HTTP_HEADERS_SENT] 在将标头发送到客户端后无法设置标头的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法删除标头

Express.js 中的新 Mongoose Schema `ERR_HTTP_HEADERS_SENT` 错误

Firebase - Node.js - Express - 错误 [ERR_HTTP_HEADERS_SENT]

错误 [ERR_HTTP_HEADERS_SENT] 在将标头发送到客户端后无法设置标头

错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头