节点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); } });