読者です 読者をやめる 読者になる 読者になる

夢見がちWeb屋の浮かれ雑記帳

フロントエンド周りの技術ネタやらなんやらね

Node.jsでローカルの空きPortを探すぜ

技術ネタ Node.js

Webサーバのテストコード書くときに、ポート固定させたくない場合が多々ある。環境依存だし、適当な空きポート使ってほしい。

5分ほどnpmを探したけどいいのがない。ポート探すのはあるけどインターフェースがCallbackだ。欲しいのはそう、Promiseだ。

探すのは早々に諦め、自前で実装。

github.com

実行すると空いてるポートを探して返すだけの超簡単なモジュール

'use strict'

const aport = require('aport')
const co = require('co')

co(function * () {
  // Find free port
  let port = yield aport()
  console.log('Free port :', port)
}).catch((err) => console.error(err))

実装全部書いてもこんだけ。

/**
 * Find a free port
 * @function aport
 * @param {Object} [options] - Optional settings
 * @param {string} [options.host='127.0.0.1'] - Host to aport port
 * @returns {Promise.<number>}
 */
'use strict'

const net = require('net')
const co = require('co')

/** @lends aport */
function aport (options) {
  options = options || {}
  let host = options.host || '127.0.0.1'

  return co(function * () {
    let server = net.createServer()
    let port = null
    server.on('listening', () => {
      port = server.address().port
      server.close()
    })

    return new Promise((resolve, reject) => {
      server.on('close', () => resolve(port))
      server.on('error', (err) => reject(err))
      server.listen(0, host)
    })
  })
}

module.exports = aport

処理としてはビルドインのnetモジュールでサーバを一瞬立ててportを取得し、すぐ閉じる。