【问题标题】:Node JS : Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client节点 JS:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头
【发布时间】: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 操作

【问题讨论】:

  • 您似乎发送了两次响应。
  • 是的..看起来像。但我似乎不明白在哪里以及如何

标签: javascript sql node.js express


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我想我不需要明确关闭 sql.open。连接仅在大括号内打开。
    猜你喜欢
    • 2020-05-26
    • 2018-09-19
    • 1970-01-01
    • 2020-09-22
    • 2023-01-19
    • 2021-02-26
    • 2021-08-20
    • 2019-09-28
    相关资源
    最近更新 更多