超简单实现一个portfinder库,查找可用端口

380 阅读1分钟

在看项目代码时看到一个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;
      }
    }
  }
}