为什么我的node.js服务器会截断响应主体?

时间:2019-11-03 23:17:59

标签: node.js get

当涉及到带有大型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;

1 个答案:

答案 0 :(得分:0)

要调试此功能,有很多事情要做:

  1. 添加console.log(results.length),以确保数据长度符合您的期望。

  2. res.end(function() { console.log('finished sending response')})添加回调,以查看http库是否认为已完成发送响应。

  3. 检查res.write()的返回值。如果它是false(表示尚未发送所有数据),请为drain事件添加一个处理程序,看看它是否被调用。

  4. 尝试使用res.setTimeout()增加发送超时,以防发送所有数据花费的时间太长。

相关问题