Node.jsでローカルの空きPortを探すぜ
Webサーバのテストコード書くときに、ポート固定させたくない場合が多々ある。環境依存だし、適当な空きポート使ってほしい。
5分ほどnpmを探したけどいいのがない。ポート探すのはあるけどインターフェースがCallbackだ。欲しいのはそう、Promiseだ。
探すのは早々に諦め、自前で実装。
実行すると空いてるポートを探して返すだけの超簡単なモジュール
'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を取得し、すぐ閉じる。