节点httpServer EADDRINUSE和下一个端口

如果端口正忙于EADDRINUSE ,我尝试增加一个基于8000的端口EADDRINUSE ,我认为这很简单,如下所示:

  var tryToOpenServer = function(port) { console.log('trying to Open: ' + port); HTTPserver .listen(port, function() { console.log('HTTP listening:' + port); }) .on('error', function(err) { if (err.code === 'EADDRINUSE') { // port is currently in use console.log('server Open error:' + port); tryToOpenServer(port + 1); } }); }; tryToOpenServer(8000); 

如果端口:8000正忙,并得到err.code ==='EADDRINUSE',端口增加,代码尝试端口。 问题是这样的

  .listen(port, function() { console.log('HTTP listening:' + port); }) 

上面的代码以某种方式成功运行在端口上:8000即使它抛出一个'EADDRINUSE',所以我有2个通知:HTTP 8000和8001。

我错过了什么? 请让我知道,谢谢。

这是一个坏主意

您的recursion创build监听指数。

如果我们在这个Gist中修改你的代码来跟踪每个创build的监听器,我们可以看到会发生什么。 当我运行代码和端口8000可用,事情很好..

当8000忙8001可用,我开始看到多个听众..:

 trying to Open: 8000 server Open error:8000 we have created 1 error event handler from 0 trying to Open: 8001 we have created 1 http server from caller 0 HTTP listening:8000 we have created 2 http server from caller 1 HTTP listening:8001 

来自尝试端口8000的第一个监听者不会消失。

更糟的是,错误侦听器也不会消失。 随着更多的错误侦听器被创build, 每个错误都会触发

当我运行你的原始代码,8000和8001都忙的时候,我得到了7个错误事件监听器和8个http监听器函数的结果。

第四次,计数在32K范围内,节点正在泄漏有关泄漏的警告。

根据Node的networking文档中的代码,更好的方法可能是这样的。 单次error handling程序可以在EADDRINUSE出现时处理EADDRINUSE错误:

 var http = require('http'); var port = 8000; var HTTPserver = http.createServer(function (request, response) { response.writeHead(200); response.end("hello from server on port: " + port); }); console.log('trying to Open: ' + port); HTTPserver .listen(port, function () { console.log('we have created ' + listenerCounter + ' http server listeners'); listenerCounter++; console.log('HTTP listening:' + port); }) .on('error', function (err) { if (err.code === 'EADDRINUSE') { port++; console.log('Address in use, retrying on port ' + port); setTimeout(function () { HTTPserver.listen(port); }, 250); } }); 

使它容易和使用portscanner

https://github.com/baalexander/node-portscanner

 portscanner.findAPortNotInUse(8000, 9000, '127.0.0.1', function(error, port) { console.log('AVAILABLE PORT AT: ' + port) }) 

这工作,很简单:

  var port = 8000; HTTPserver .listen(port, function() { console.log('HTTP listening:' + port); }) .on('error', function(err) { if (err.code === 'EADDRINUSE') { // port is currently in use console.log('server Open error:' + port); port++; HTTPserver .listen(port); } });