Javascript 节点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

我正在使用一个节点后端(1)从Feedly云请求API数据,(2)以JSON格式输出该数据,然后(3)从JS前端检索它

此问题仅与阶段(2)有关

首次发行 在试图打印前端要检索的数据时,我注意到节点切断了中流,留下格式错误的JSON

尝试解决方案 在编写响应内容之前,我尝试为内容长度设置响应标题,以强制它打印整个内容。成功了,大约两次。但随后它开始大惊小怪:

持续失败 现在,该应用程序在函数运行时崩溃,声称我在写入内容或输出到页面后设置HTTP头,但据我所知,我没有设置

代码 错误
\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实际上在以后的尝试中,它是在该函数之外写入的,但这两种解决方案我都没有成功。如何获得未定义var
json
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);