在日常开发中,我们常常要自己启动一个server来进行本地调试,但是如果写死端口,就会导致端口冲突,怎么解决呢?
/* 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, };
具体使用的时候,调用findUsablePort即可:
findUsablePort(4000).then((port) => app.listen(port))
如果4000可用,就会直接用4000,否则就会使用一个随机端口。
net.createConnection({ port })这种模式是建立客户端尝试连接该端口, 但是如果该端口已经被使用,但防火墙做了限制,应该也会触发连接错误; 会造成误判;
用创建服务监听的方式应该更完善一些.