Node.js listen()在server.close()之后抛出'EADDRINUSE'

时间:2014-03-20 23:59:35

标签: node.js

我正在尝试终止群集工作者,而不需要释放一些资源。这是我在worker中使用的代码:

server.on("close", function() {
    process.exit();
});
server.close();

当worker从master获取命令时执行此代码。 "关闭"回调被叫,但我无法访问工人正在使用的任何端口。所以我有这个代码

var server = require('http').createServer(function(req, res) {
    res.writeHead(200);
    res.end('');
});
server.listen(8080);

如果我退出后重新启动工作人员,我会得到EADDRINUSE'对于8080端口的listen()。

2 个答案:

答案 0 :(得分:1)

请运行此脚本以终止与节点相关的进程。并再次运行您的代码

(function(){
   "use strict";  
    var exec    = require('child_process').exec,
    lCmd    = 'kill -9'             +   ' ' + /* kill finded process */
              '`ps ax'              +   '|' + /* show all process    */
              'grep node-openshift' +   '|' + /* find node-openshift */
              'grep -v grep'        +   '|' + /* exlude grep command */
              'awk "{print $1}"`';            /* show first collumn  */

     exec(lCmd, function(error, stdout, stderr){
    console.log(error || stdout || stderr);
 }); 
})();

答案 1 :(得分:0)

事实证明,Socket.io(在端口上侦听的是什么)在终止之前不会释放端口。这样做是为了允许端口重用。我能够使用与之前使用的完全相同的端口重新创建socket.io实例。因此,如果我使用端口8080连接到购物车的socket.io连接和端口8081连接负责建议的套接字,我将不得不在下次创建购物车套接字实例时调用listen(8080)

我想在不同的时间为不同的连接使用不同的端口。我试图宣布连接,因为它们可用,但我想我现在必须硬编码不同服务的端口。至少EADDRINUSE不再出现了。