如何知道节点中的`http.Server`实例是否已经在监听

seb*_*piq 7 node.js

我有一个http服务器和一段代码,只有在服务器正在侦听时才需要运行.为此,我这样绑定"listening"事件:

server.on('listening', doSomething)
Run Code Online (Sandbox Code Playgroud)

问题是我的服务器可能已经在监听,然后事件"listening"将不会被发出,我的代码将无法运行...有没有办法知道服务器的状态?就像是 :

if (server.isListening() === true) doSomething()
else server.on('listening', doSomething)
Run Code Online (Sandbox Code Playgroud)

编辑我当然可以(正如在其他类似问题中所建议的那样)尝试连接到该端口并查看是否有人在听.但这并不能证明我使用的特定实例正在倾听.只是有些服务正在那里听.

pet*_*teb 7

当使用http.createServeraddress()函数的实例时,服务器实例可以使用该实例.这表示实际服务器是否正在侦听和可用.

直到listen()调用服务器实例address()返回一个null因为实例本身还没有它正在侦听的地址.

一旦listen()被调用,address()将返回一个对象.

var http = require('http');
var server = http.createServer();

console.log(server.address()); // This will be null because listen() hasn't been called yet

server.listen(3000, 'localhost', function() { 
    console.log('listening'); 
});

console.log(server.address()); // { address: '127.0.0.1', family: 'IPv4', port: 3000 }
Run Code Online (Sandbox Code Playgroud)

摘要

如果server.address()null,您的实例未运行.
如果server.address()返回一个对象,则您的实例正在运行.