node获取可用端口的同步尝试

2 篇文章 0 订阅

如果想直接用异步回调的方式, then这种,看这位兄台的博客就可以nodejs检查端口是否被占用(完美方案)

而我是想用同步写异步的方式去做 (async+await)

第一种失败尝试

var Promise = require('bluebird')
const net = require('net');

async function getFreePort() {

      while (true) {
        var port = debugPorts.shift()
        var used = await portInUse(port)
        if (!used || debugPorts.length === 0) {
          break
        }
      }
      if (debugPorts.length === 0) {
        log.fatal('分配端口已达最大限额')
        return null
      }
      return port
    }

function portInUse(port){
      return new Promise((resolve, reject)=>{
        
        let server = net.createServer().listen(port);
        server.on('listening',function(){
          server.close();
          resolve(port);
        });
        server.on('error',function(err){
          if(err.code == 'EADDRINUSE'){
            log.warn(err)
            resolve(null)
          }
        });
      });
    }

可想而知,在while循环里我拿到的 portInUse的返回值只会是[object Promise]. 因为JS是单线程,事件驱动语言。

第二种成功尝试

var Promise = require('bluebird')
const net = require('net');

function getFreePort(){
      return new Promise((resolve, reject)=>{
        if (debugPorts.length === 0) {
          log.info('分配端口已达最大限额')
          return resolve(null)
        }
        var port = debugPorts.shift()
        let server = net.createServer().listen(port);
        server.on('listening',function(){
          server.close();
          resolve(port);
        });
        server.on('error',function(err){
          if(err.code == 'EADDRINUSE'){
            log.warn(err)
            getFreePort()
          }
        });
      });
    }

async function getPort(){
 var availablePort = await getFreePort();
}

Done.

续文中的debugPorts变量:

var debugPorts = range(12000, 12300)
function range(from, to) {
  var items = []
  for (var i = from; i <= to; ++i) {
    items.push(i)
  }
  return items
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值