【问题标题】:Error with NodeJSNodeJS 出错
【发布时间】:2016-09-07 03:03:28
【问题描述】:

当我尝试运行我的脚本时出现此错误。

{ [Error: listen EADDRINUSE :::8000]
  code: 'EADDRINUSE',
  errno: 'EADDRINUSE',
  syscall: 'listen',
  address: '::',
  port: 8000 }
Error: listen EADDRINUSE :::8000
    at Object.exports._errnoException (util.js:890:11)
    at exports._exceptionWithHostPort (util.js:913:20)
    at Server._listen2 (net.js:1234:14)
    at listen (net.js:1270:10)
    at Server.listen (net.js:1366:5)
    at Server.listen.Server.attach (/usr/lib/node_modules/socket.io/lib/index.js:216:9)
    at Timeout._onTimeout (/var/www/html/Bot/site.js:618:29)
    at tryOnTimeout (timers.js:224:11)
    at Timer.listOnTimeout (timers.js:198:5)

Script.js 约 605 行

function load() {
    query('SET NAMES utf8');
    query('SELECT `id` FROM `rolls` ORDER BY `id` DESC LIMIT 1', function(err, row) {
        if((err) || (!row.length)) {
            logger.error('Cant get number from the last game');
            logger.debug(err);
            process.exit(0);
            return;
        }
        currentRollid = row[0].id;
        logger.trace('Roll '+currentRollid);
    });
    loadHistory();
    setTimeout(function() { io.listen(8080); }, 3000);
}

618行是

setTimeout(function() { io.listen(8080); }, 3000);

我该如何解决这个问题?我尝试更改 io.listen 端口,但它仍然不起作用。

【问题讨论】:

标签: node.js timeout


【解决方案1】:

首先,您应该知道EADDRINUSE 错误会在您尝试侦听的端口已在使用中时引发。

要解决此问题,您需要释放应用程序尝试侦听的端口(如果您使用的是 Linux,也许您会发现 this StackOverflow thread 很有用)。

在 NodeJS 中创建服务器时,通常最好监听 [进程] 退出事件,这样您就可以关闭服务器,从而释放它正在监听的端口。

这里有一些很棒的文档,提供了有关在 NodeJS 进程终止之前可以触发的不同事件的信息:

根据您提供的 sn-ps,我假设您正在使用 SocketIO。

This StackOverflow answer 给出了一个很好的例子来说明如何关闭一个 SocketIO 服务器。

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-03-21
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    相关资源
    最近更新 更多