get-port:获取可用TCP端口,支持指定端口、端口范围及排除端口

Get an available TCP port

Branch1Tags20
This repository is empty

get-port

获取一个可用的 TCP 端口

安装

npm install get-port

使用方法

import getPort from 'get-port';

console.log(await getPort());
//=> 51402

传入首选端口:

import getPort from 'get-port';

console.log(await getPort({port: 3000}));
// Will use 3000 if available, otherwise fall back to a random port

传入首选端口数组:

import getPort from 'get-port';

console.log(await getPort({port: [3000, 3001, 3002]}));
// Will use any element in the preferred ports array if available, otherwise fall back to a random port

若你需要某个特定范围内的端口,请使用 portNumbers() 辅助函数:

import getPort, {portNumbers} from 'get-port';

console.log(await getPort({port: portNumbers(3000, 3100)}));
// Will use any port from 3000 to 3100, otherwise fall back to a random port

API

getPort(options?)

返回一个用于获取端口号的 Promise

options

类型:object

port

类型:number | Iterable<number>

首选端口或首选端口的可迭代对象。

exclude

类型:Iterable<number>

不应返回的端口。

例如,你可以将 portNumbers() 函数的返回值传递给它。

reserve

类型:boolean
默认值:false

保留端口,使其在进程的生命周期内保持锁定,而不是默认的 15-30 秒。

当获取端口到实际绑定端口之间存在较长延迟时(例如在长时间运行的测试套件中),这非常有用。

保留的端口会按端口号在当前进程中全局锁定,即使你使用特定的 hostipv6Only 选项查找它们。

使用 clearLockedPorts() 释放保留的端口。

host

类型:string

应在其上执行端口解析的主机。可以是 IPv4 或 IPv6 地址。

默认情况下,它会检查 OS 网络接口 中定义的所有本地地址的可用性。如果设置了此选项,它将仅检查指定的主机。

portNumbers(from, to)

生成给定范围 from...to 内的端口号。

返回给定范围内端口号的 Iterable

import getPort, {portNumbers} from 'get-port';

console.log(await getPort({port: portNumbers(3000, 3100)}));
// Will use any port from 3000 to 3100, otherwise fall back to a random port

from

类型:number

范围的起始端口。必须在 1024...65535 范围内。

to

类型:number

范围的结束端口。必须在 1024...65535 范围内,且必须大于 from

clearLockedPorts()

清除已锁定端口的内部缓存,包括使用 reserve 选项锁定的任何端口。

当你希望结果不受之前调用的影响时,此方法会很有用。

请注意,清除缓存会移除针对进程内竞争条件的保护。

import getPort, {clearLockedPorts} from 'get-port';

const port = [3000, 3001, 3002];

console.log(await getPort({port}));
//=> 3000

console.log(await getPort({port}));
//=> 3001

// If you want the results to be unaffected by previous calls, clear the cache.
clearLockedPorts();

console.log(await getPort({port}));
//=> 3000

注意事项

在获取端口号到实际开始使用端口号的这段时间内,如果有其他进程开始使用相同的端口号,可能会存在极小概率的竞争条件。

进程内竞争条件(例如运行并行 Jest 测试时)已通过轻量级锁定机制完全消除,该机制会将返回的端口保留 15-30 秒,之后才允许重新使用。如果从获取端口到绑定端口之间的延迟可能超过此时间窗口(例如在长时间运行的测试套件中),请使用 reserve 选项将端口锁定,直至进程结束。

跨进程竞争条件极为罕见,当尝试绑定端口时,会立即导致 EADDRINUSE 错误,从而允许应用程序重试。

相关链接

Introduction

Get an available TCP port

Customize your domain