【发布时间】:2017-11-28 15:10:45
【问题描述】:
我有一个托管在 Amazon EC2 上的 REST api,它是用 Nodejs (Express) 编写的。
在特定的 REST 调用中,大约 5MB 的回复被发送到客户端。在客户端完全收到回复之前,客户端会打印以下错误消息。
Premature end of Content-Length delimited message body
我在 nodejs 服务器中添加了一个连接侦听器,如下所示,以检查服务器上发生了什么。
var app = express();
var server = http.createServer(app);
var port = app.get('port');
server.listen(port);
server.on('error', onError);
server.on('listening', onListening);
server.on('connection', function (socket) {
log.debug('SOCKET OPENED' + JSON.stringify(socket.address()));
socket.setTimeout(300000); //5 minute timeout
socket.on('end', function () {
log.debug('SOCKET END: other end of the socket sends a FIN packet');
});
socket.on('timeout', function () {
log.warn('SOCKET TIMEOUT');
});
socket.on('error', function (error) {
log.warn('SOCKET ERROR: ' + JSON.stringify(error));
});
socket.on('close', function (had_error) {
log.debug('SOCKET CLOSED. IT WAS ERROR: ' + had_error);
});
});
我观察到SOCKET TIMEOUT 已登录后端。在上面的代码中,我将socket超时时间增加到了5分钟,但似乎没有任何效果。
早些时候我在 Google 计算引擎中托管了 REST API,当时我没有遇到这个问题。
这可能是什么问题?
编辑:这是 REST API 调用的代码。
我的app.js中有以下代码
require('./routes/index')(app);
下面是routes目录的index.js。
var changeCase = require('change-case');
var express = require('express');
var routes = require('require-dir')();
module.exports = function (app) {
Object.keys(routes).forEach(function (routeName) {
var router = express.Router();
require('./' + routeName)(router);
app.use('/api/' + changeCase.paramCase(routeName), router);
});
};
可以看出,它循环遍历routes目录下的所有js文件,并将文件名注册为app中的URL路径。
这是我遇到此问题的特定路线的代码。
module.exports = function (router) {
router.get("/fetch", function (req, res, next) {
itemModel.fetch(req.user.clientId, function (error, items) {
if (error) {
res.status(500).json({error: error});
} else {
res.json(items); //items is a JSON array
}
});
});
}
【问题讨论】:
-
那么:REST API 在哪里?我只能看到一些 WebSocket 代码;)另外:你如何发送/接收数据?另外:您使用的是哪个 WebSocket 实现?
-
@jsalonen,更新问题
-
是的。两者都存在问题。
-
从 mongodb 获取文档需要很短的时间(大约 1 秒)。大约 20 秒后,客户端报告服务器终止了连接(它大约收到了大约 1MB 的回复)。
-
@jsalonen,为 http 服务器设置超时就可以了
标签: node.js sockets express amazon-ec2