如题所示,node开发中,可能会遇到开启tcp/http服务端口被占用的问题,解决起来也很简单,直接换一个端口就可以了。但是每次启动,发现失败,然后更改监听端口来测试,也很麻烦。
本文介绍的办法,也是一种通用的办法,端口如果没有被占用,就用该端口,如果端口被占用,一般端口参数是整数,这个时候+1,变更端口,再监听,直到没有被占用,就使用该端口。
比如,我们监听8080,发现没有监听,那么使用8080。如果被监听,那么使用8081端口,再不行,使用8082,直到端口可用。
isPortOccupied.js使用Promise的思想,监听指定端口,如果监听成功,那么表示该端口没有被占用,取消监听,返回端口给调用者。如果监听出现错误,则将端口+1,继续递归调用监听,直到监听成功,取消监听,将可用端口号返回给调用者。调用者拿到合适的端口,开启自己的监听服务。就解决了靠自己手动修改端口号去盲试的问题。
const net = require('net')
export function isPortOccupied(port){
var server = net.createServer().listen(port)
return new Promise((resolve,reject)=>{
// 如果监听成功,表示端口没有被其他服务占用,端口可用,取消监听,返回端口给调用者。
server.on("listening",()=>{
console.log('the server is running on port '+port)
server.close()
resolve(port)
})
// 如果监听出错,端口+1,继续监听,直到监听成功。
server.on("error",(err)=>{
if(err