我将在这里非常具体,希望了解这一点的人可以编辑以重新描述一般情况。
目前,当您运行“node debug”时,它会生成一个进程以侦听端口5858.然后在父进程中,尝试连接到该端口。
但是,如果您正在运行另一个“节点调试”会话,则当前“节点调试”会挂起,因为该端口正在使用中。
具体而言,您看到的信息是:
$ node debug example/gcd.js 3 5
< debugger listening on port 5858 >
connecting...
最好是检测端口正在使用(没有连接到它可能会弄乱另一个尝试连接现有调试器的客户端)。
编辑:已接受的解决方案现在位于trepanjs。
另见Node JS - How Can You Tell If A Socket Is Already Open With The Einaros WS Socket Module?
答案 0 :(得分:13)
以下是我使用的变体:
var net = require('net');
var portInUse = function(port, callback) {
var server = net.createServer(function(socket) {
socket.write('Echo server\r\n');
socket.pipe(socket);
});
server.listen(port, '127.0.0.1');
server.on('error', function (e) {
callback(true);
});
server.on('listening', function (e) {
server.close();
callback(false);
});
};
portInUse(5858, function(returnValue) {
console.log(returnValue);
});
更多涉及的实际提交是https://github.com/rocky/trepanjs/commit/f219410d72aba8cd4e91f31fea92a5a09c1d78f8
答案 1 :(得分:3)
您应该能够使用node-netstat
module来检测正在侦听的端口。 不幸的是,它似乎只支持Windows和Linux。但是,支持OS X所需的更改看起来并不是非常大。更新:它现在支持OS X ...呃macOS ...呃现在无论它们正在调用它。
答案 2 :(得分:1)
使用内部http模块:
const isPortFree = port =>
new Promise(resolve => {
const server = require('http')
.createServer()
.listen(port, () => {
server.close()
resolve(true)
})
.on('error', () => {
resolve(false)
})
})