【问题标题】:HTTP connection gets prematurely terminated in nodejs app hosted on Amazon EC2HTTP 连接在 Amazon EC2 上托管的 nodejs 应用程序中过早终止
【发布时间】: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


【解决方案1】:

为 HTTP 服务器设置超时解决了这个问题。

var server = http.createServer(app);
var port = app.get('port');
server.listen(port);
server.setTimeout(300000, function (socket) {
});

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 2011-11-16
    • 2010-11-09
    • 2012-10-28
    • 2018-06-29
    • 2018-03-23
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    相关资源
    最近更新 更多