node检测端口是否被占用isPortOccupied.js

    如题所示,node开发中,可能会遇到开启tcp/http服务端口被占用的问题,解决起来也很简单,直接换一个端口就可以了。但是每次启动,发现失败,然后更改监听端口来测试,也很麻烦。

    本文介绍的办法,也是一种通用的办法,端口如果没有被占用,就用该端口,如果端口被占用,一般端口参数是整数,这个时候+1,变更端口,再监听,直到没有被占用,就使用该端口。

    比如,我们监听8080,发现没有监听,那么使用8080。如果被监听,那么使用8081端口,再不行,使用8082,直到端口可用。

    portIsOccupied.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.code === 'EADDRINUSE'){
                resolve(isPortOccupied(port+1))
                console.log('this port '+ port+' is occupied try another.')
            }else{
                reject(err)
            }
        })
    })
}

    在调用的地方,可以这样来操作:

    isPortOccupied(8000).then(port=>{
        httpServer.listen(port,function(){
            logger.main.info("http server listening at port "+port)
        })
    })

    关于端口占用问题,我们这里不能直接把占用端口的进程杀死,有可能是别的服务,所以发现被占用,是更换一个端口,今天介绍的这种办法采用+1的办法来更换端口号,最终一定可以得到一个可用的端口。 

你可能感兴趣的:(Web前端,javascript,前端,端口占用检测,promise,http)