Nodejs检查端口是否占用,如果被占用使用一个随机端口

广告位招租
扫码页面底部二维码联系

在日常开发中,我们常常要自己启动一个se【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。rver来进行本地调试,但是如果写死端口【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。,就会导致端口冲突,怎么解决呢?

【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。
/* eslint-disable @typescript-eslint/no-require-imports */
const net = require('net');

function checkPortUsable(port) {
  return new Promise((resolve, reject) => {
    const server = net.createConnection({ port });
    server.on('connect', () => {
      server.end();
      reject(`Port ${port} is not available!`);
    });
    server.on('error', () => {
      resolve(port);
    });
  });
}

function randomNumByRange(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function findUsablePort(port, minPort = 10000, maxPort = 65536) {
  const retry = () => {
    const port = randomNumByRange(minPort, maxPort);
    return findUsablePort(port, minPort, maxPort);
  };
  return checkPortUsable(port)
    .then(() => port)
    .catch(retry);
}

module.exports = {
  findUsablePort,
  checkPortUsable,
};

具体使用的时候,调用findUsable未经授权,禁止复制转载。【未经授权禁止转载】Port即可:

【原创不易,请尊重版权】【本文受版权保护】未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net
findUsablePort(4000).then((port) => app.listen(port))

如果4000可用,就会直接用4000,否本文作者:唐霜,转载请注明出处。【本文首发于唐霜的博客】则就会使用一个随机端口。

原创内容,盗版必究。【原创内容,转载请注明出处】【关注微信公众号:wwwtangshuangnet】
已有1条评论
  1. 躁动de气球 2022-08-31 17:33

    net.createConnection({ port })这种模式是建立客户端尝试连接该端口, 但是如果该端口已经被使用,但防火墙做了限制,应该也会触发连接错误; 会造成误判;
    用创建服务监听的方式应该更完善一些.