在看项目代码时看到一个portfinder的库,是查找可用端口的库。一想起这,我好像之前也实现过这种功能。
// 获取空闲端口
const net = require('net');
async function getAvailablePort(port, portAvailableCallback) {
const portUsed = port => {
const server = net.createServer().listen(port)
return new Promise((resolve, reject) => {
server.on('listening', () => {
server.close()
resolve(false)
})
server.on('error', err => {
if (err.code === 'EADDRINUSE') {
resolve(true)
}
})
})
}
const tryUsePort = async function (port, portAvailableCallback) {
const res = await portUsed(port)
if (res) {
port++
tryUsePort(port, portAvailableCallback)
} else {
portAvailableCallback(port)
return port
}
}
return new Promise((resolve, reject) => {
tryUsePort(port, portAvailableCallback)
})
}
使用
const port = 8080
getAvailablePort(port, availablePort => {
console.log(availablePort)
})
再来一个获取本地ip的代码就完美了,以后就不用下载portfinder库了。
// 获取本地ip
const os = require('os');
function getIPAddress() {
const interfaces = os.networkInterfaces();
for (const devName in interfaces) {
const iface = interfaces[devName];
for (let i = 0; i < iface.length; i++) {
const alias = iface[i];
if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
return alias.address;
}
}
}
}