节点 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]:在将标头发送到客户端后无法设置标头的主要内容,如果未能解决你的问题,请参考以下文章
节点 js 错误:找不到模块 './lib/socket.io'
错误:无法在视图目录节点 JS 和 Jquery 错误中查找视图“错误”