当涉及到带有大型JSON(30-35MB)的GET端点时,我的节点服务器有一个奇怪的行为。
我没有使用任何npm软件包。只是核心API。
仅当从Internet查询服务器时,才会发生意外行为,如果从本地网络查询服务器,则行为正常。
问题是服务器在写入内容主体的前1260个字节后停止写入响应。它不会关闭连接也不会引发错误。失眠症(我用于测试的REST客户端)只是说它收到了1260B的数据块。如果我从本地计算机查询相同的端点,则表示它收到了越来越多的块(每个块数KB)。
我什至不认为问题是由节点引起的,但是由于我使用的是干净的树莓派(安装了raspbian,然后是节点v13.0.1),并且我使用的唯一进程是不知道的node.js如何找到问题的根源,没有责任归咎于负载平衡器或Web服务器。而且公共IP似乎还可以,其他端点正常工作(每个请求的回复小于1260B)
该终结点的代码如下
const text = url.parse(req.url, true).query.text;
if (text.length > 4) {
let results = await models.fullTextSearch(text);
results = await results.map(async result=>{
result.Data = await models.FindData(result.ProductID, 30);
return result;
});
results = await Promise.all(results);
results = JSON.stringify(results);
res.writeHead(200, {'Content-Type': 'application/json', 'Transfer-Encoding': 'chunked', 'Access-Control-Allow-Origin': '*', 'Cache-Control': 'max-age=600'});
res.write(results);
res.end();
break;
}
res.writeHead(403, {'Content-Type': 'text/plain', 'Access-Control-Allow-Origin': '*'});
res.write("You made an invalid request!");
break;
答案 0 :(得分:0)
要调试此功能,有很多事情要做:
添加console.log(results.length)
,以确保数据长度符合您的期望。
向res.end(function() { console.log('finished sending response')})
添加回调,以查看http库是否认为已完成发送响应。
检查res.write()
的返回值。如果它是false
(表示尚未发送所有数据),请为drain
事件添加一个处理程序,看看它是否被调用。
尝试使用res.setTimeout()
增加发送超时,以防发送所有数据花费的时间太长。