Javascript 节点JSON输出格式错误,无法设置要修复的HTTP标头:内容长度 问题 背景与意图
我正在使用一个节点后端(1)从Feedly云请求API数据,(2)以JSON格式输出该数据,然后(3)从JS前端检索它 此问题仅与阶段(2)有关 首次发行 在试图打印前端要检索的数据时,我注意到节点切断了中流,留下格式错误的JSON 尝试解决方案 在编写响应内容之前,我尝试为内容长度设置响应标题,以强制它打印整个内容。成功了,大约两次。但随后它开始大惊小怪: 持续失败 现在,该应用程序在函数运行时崩溃,声称我在写入内容或输出到页面后设置HTTP头,但据我所知,我没有设置 代码 错误Javascript 节点JSON输出格式错误,无法设置要修复的HTTP标头:内容长度 问题 背景与意图,javascript,node.js,http,express,sails.js,Javascript,Node.js,Http,Express,Sails.js,我正在使用一个节点后端(1)从Feedly云请求API数据,(2)以JSON格式输出该数据,然后(3)从JS前端检索它 此问题仅与阶段(2)有关 首次发行 在试图打印前端要检索的数据时,我注意到节点切断了中流,留下格式错误的JSON 尝试解决方案 在编写响应内容之前,我尝试为内容长度设置响应标题,以强制它打印整个内容。成功了,大约两次。但随后它开始大惊小怪: 持续失败 现在,该应用程序在函数运行时崩溃,声称我在写入内容或输出到页面后设置HTTP头,但据我所知,我没有设置 代码 错误 \u htt
\u http\u outgoing.js:331
抛出新错误('发送头后无法设置头');
^
错误:发送邮件后无法设置邮件头。
在ServerResponse.OutgoingMessage.setHeader(_http_outgoing.js:331:11)
在ServerResponse.res.setHeader(/Users/jan/Sites/proxenos/node_modules/sails/node_modules/express/node_modules/connect/lib/patch.js:63:22)
在服务器响应。(/Users/jan/Sites/proxenos/node_modules/sails/node_modules/express/node_modules/connect/lib/patch.js:80:14)
at Array.forEach(本机)
在ServerResponse.res.writeHead(/Users/jan/Sites/proxenos/node_modules/sails/node_modules/express/node_modules/connect/lib/patch.js:79:28)
在收到消息时。(/Users/jan/Sites/proxenos/api/controllers/FeedlyController.js:12:19)
在IncomingMessage.EventEmitter.emit(events.js:107:17)
在readableAddChunk(_stream_readable.js:159:16)
在IncomingMessage.Readable.push(_stream_Readable.js:126:10)
在HTTPParser.parserOnBody(_http_common.js:132:22)
我怀疑您的数据事件触发了多次(因为它就是这样工作的,多个数据
事件,然后是最后一个结束
事件。)
您可能需要通读可读流文档(这就是响应
对象)
我会尝试将您的处理程序更改为:
res.writeHead(200, {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(json, 'utf8')
});
response.on('data', function(json){
res.write(json, 'UTF-8');
});
response.on('end', function(){
res.end();
});
尽管您可以通过管道将其传递:
response.pipe(res);
(而不是显式地侦听数据和结束事件)您正在
success
函数中写入标题?当更多数据到达时,数据
事件可能会多次触发。@jasonscript实际上在以后的尝试中,它是在该函数之外写入的,但这两种解决方案我都没有成功。如何获得未定义varjson
的Buffer.byteLength(json,'utf8')
?没关系,我删除了content-length参数,一切都解决了。一定是您的结论,数据事件确实触发了多次,这干扰了输出。干杯啊,是的,我没看到。检查响应标题,看看是否可以重用它们的内容长度。
res.writeHead(200, {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(json, 'utf8')
});
response.on('data', function(json){
res.write(json, 'UTF-8');
});
response.on('end', function(){
res.end();
});
response.pipe(res);