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

Posted

技术标签:

【中文标题】节点 JS:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头【英文标题】:Node JS : Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 【发布时间】:2021-06-17 07:44:15 【问题描述】:

这里是初学者。我了解当 api 尝试多次设置响应时会出现以下错误消息。而且我也实现了node js的异步特性。

但我仍然无法调试问题。请帮帮我。

router.route("/new").post((req, res) => 

  //Variable declarations
  sql.open(connectionString, function(err, conn)
    var pm = conn.procedureMgr();
    pm.callproc('dbo.AddRequestDetails',[request_zone,request_type,requester_type,request_flow,
      sales_order,requester_email,quotation,request_reason,request_status,
      StatusFlag, bot_status,bot_comments,additional_notification_to,additional_information, approver,
      old_value,new_value,new_shipping_point,partner_name,text_type,text_type_action,table_data], function(err,results,output)
      console.log("Hi");
        if (err != null) 
        console.log("error",err.message);
        var user =  req.ge('User');
        var scriptName = path.basename(__filename);
        var value = err: err.message, user: user, scriptName:scriptName;
        axios.post(configData.SERVER_URL + "/api/logToDB", value);
        res.status(400).json(err.message);
       else 
        console.log("Data successfully added in Main Table & Sub Table");
        res.json("Data successfully added in Main Table & Sub Table");
      
      
    );
  );
);

module.exports = router;

我的输出如下所示。

Hi
Data successfully added in Main Table & Sub Table
POST /api/add/new 200 44.882 ms - 51
Hi
Data successfully added in Main Table & Sub Table
_http_outgoing.js:558
    throw new ERR_HTTP_HEADERS_SENT('set');
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they
are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:558:11)
    at ServerResponse.header (C:\Users\C572103\Documents\One
Order Change\OOC Portal\backend\node_modules\express\lib\response.js:767:10)
    at ServerResponse.send (C:\Users\C572103\Documents\One Order Change\OOC Portal\backend\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (C:\Users\C572103\Documents\One Order Change\OOC Portal\backend\node_modules\express\lib\response.js:267:15)
    at C:\Users\C572103\Documents\One Order Change\OOC Portal\backend\routes\uploadData.js:58:13
    at Object.callback (C:\Users\C572103\Documents\One Order
Change\OOC Portal\backend\node_modules\msnodesqlv8\lib\procedure.js:233:13)
    at onProcedureRaw (C:\Users\C572103\Documents\One Order Change\OOC Portal\backend\node_modules\msnodesqlv8\lib\procedure.js:60:22)
    at C:\Users\C572103\Documents\One Order Change\OOC Portal\backend\node_modules\msnodesqlv8\lib\reader.js:199:15
    at onStatementComplete (C:\Users\C572103\Documents\One Order Change\OOC Portal\backend\node_modules\msnodesqlv8\lib\driver.js:185:11)
    at Object.end (C:\Users\C572103\Documents\One Order Change\OOC Portal\backend\node_modules\msnodesqlv8\lib\driver.js:318:19) 
  code: 'ERR_HTTP_HEADERS_SENT'

我正在使用 msnodesqlv8 进行 sql 操作

【问题讨论】:

您似乎发送了两次响应。 是的..看起来像。但我似乎不明白在哪里以及如何 【参考方案1】:

似乎你要在发送响应后设置响应的标题(如 res.setHeader(400)),控制 if else 语句,似乎在发送 200 后输入错误 else

【讨论】:

【参考方案2】:

从您的代码中很明显Hi 被调用了两次。我的猜测是您正在使用sql.open 打开一个新的 sql 连接,但您从未关闭它。即使您将结果发送到响应,连接仍然打开,并且某些侦听器可能会再次触发,即使是在另一个请求中。

还要检查单个请求中 pm.callproc 是否只做一件事,然后不触发两个回调,因为基本上这是真正的问题 - 您尝试为同一个请求发送两个响应。

【讨论】:

我想我不需要明确关闭 sql.open。连接仅在大括号内打开。

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

@npm 通过节点脚本和节点箱在 Vue.js 中运行错误

节点 js 错误:找不到模块 './lib/socket.io'

错误:无法在视图目录节点 JS 和 Jquery 错误中查找视图“错误”

GraphQL Schema.js 文件错误 - 节点/快递

部署智能合约时出现节点错误 - Web3.js

当我使用节点启动机器人时,为啥 discord.js 模块出现错误?