【问题标题】:Node.js HTTP Server Stops ListeningNode.js HTTP 服务器停止监听
【发布时间】:2013-07-26 04:24:22
【问题描述】:

我在端口 1338 上设置了一个 HTTP 服务器来监听服务器的 IP。这在我第一次启动 Node 时工作得很好,但由于某种原因,我遇到了服务器随机停止监听的问题。我检查了 Forever 从我的应用程序收集的日志,包括任何未捕获的异常。自启动以来出现任何错误的日志中都没有显示任何内容。

我的问题有两个。什么会导致服务器以随机间隔停止侦听?另外应该在 Node 中运行什么检查,以便我可以注销导致侦听器停止的错误?

下面是我的 HTTP 服务器的代码。

http.createServer(function (req, res) {
    var pathname = url.parse(req.url).pathname;
    var query = url.parse(req.url, true).query;
    var check;
    var responseData = '';
    if(pathname === '/healthcheck/ticket'){
        check = new Date().getTime();
        check = check - tickets.lastAction;
        if(check < 30000){
            responseData = "page ok";
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.end(responseData);
        }
        else{
            check = check/1000;
            responseData = 'Last action taken by the Ticket Generator was ' + check + ' seconds ago';
            res.writeHead(200, {'Content-Type': 'text/plain'});
            res.end(responseData);
        }
    }
    else{
        responseData = 'URL NOT FOUND!';
        res.writeHead(404, {'Content-Type': 'text/plain'});
        res.end(responseData);
    }
}).listen(config.eng.port, config.eng.host);

【问题讨论】:

  • 我很确定服务器不会随机停止监听,但你必须弄清楚是什么原因导致它停止。我尝试了您上面显示的代码,但它似乎永远不会停止收听(代码中没有任何内容表明它会停止收听)。您是否尝试过 console.log 一切并试图弄清楚在停止侦听之前运行的最后一条指令是什么?另外(这可能是一个愚蠢的建议,但我不知道永远是如何工作的)你确定永远不会在重新启动时覆盖日志(以防它是由抛出的错误引起的)?
  • 我已经检查过了,它只是在附加日志。当然,它今天还没有发生(有时需要几天时间),但我将使用更多控制台日志记录重新启动它,以显示每个步骤并查看它在哪里死亡。

标签: node.js


【解决方案1】:

当pathname 不等于/healthcheck/ticket 时,您不会处理这种情况。没有其他分支。

因此,当您的服务器被其他网址调用但/healthcheck/ticket 时,它永远不会关闭res 流,因为永远不会调用res.end()。

一段时间后,您的服务器耗尽(网络)资源,因此似乎挂起(即它不再对新请求作出反应)。

解决方法很简单:提供一个else分支,在里面调用res.end(),应该就没事了。

【讨论】:

  • 抱歉,我确实没有找到我放在那里的 URL,但是当我剪掉一些公司不希望显示的代码时,它被剪掉了。现在更新代码以更好地反映对 else 的处理。
猜你喜欢
  • 2013-03-13
  • 1970-01-01
  • 2018-05-27
  • 2012-11-05
  • 2023-03-14
  • 2013-02-02
  • 2013-08-26
  • 2014-02-06
  • 1970-01-01
相关资源
最近更新 更多