# @arcjet/ip 中文文档

规范地址：https://npmcn.com/package/%40arcjet/ip/

版本：1\.15\.0
npm 元数据更新时间：2026-10-28T18:45:20.860Z
中文译文更新时间：2026-11-06T14:42:42.572Z
软件包许可：Apache-2\.0

本文由上游 README 翻译，可能存在偏差，请结合原文核对 API、命令与配置。版权与许可归原作者所有。

原始 npm 页面：https://www.npmjs.com/package/%40arcjet/ip
原文对照：https://npmcn.com/package/%40arcjet/ip/?lang=original
项目主页：https://arcjet.com/
源码仓库：https://github.com/arcjet/arcjet-js

## 关键信息（来自 npm 元数据）

- 包体积（解压后）：57.1 kB，7 个文件
- 模块格式：ES Module
- TypeScript 类型：包内自带
- Node.js 要求：\>=22\.21\.0 \<23 \|\| \>=24\.5\.0
- 运行依赖：0 个
- 首次发布：2023-12-07T21:02:13.095Z
- 最新版本发布：2026-10-28T18:45:19.979Z
- 近 30 天下载量：355529（2026-10-07 至 2026-11-05，npm 官方下载统计）
- 已发布版本数：79（近 12 个月 30 个）

## 中文简介

寻找请求原生IP的Arcjet 工具

## 安装

```sh
npm install @arcjet/ip
```

也可以使用：`pnpm add @arcjet/ip`、`yarn add @arcjet/ip`、`bun add @arcjet/ip`

## README

[![Arcjet Logo](https://arcjet.com/logo/arcjet-light-lockup-voyage-horizontal.svg)](https://arcjet.com/)

# `@arcjet/ip`

[![npm badge](https://img.shields.io/npm/v/%40arcjet%2Fip?style=flat-square&label=%E2%9C%A6Aj&labelColor=ECE6F0&color=ECE6F0)](https://www.npmjs.com/package/@arcjet/ip)

[弧喷](https://arcjet.com/) 用于查找请求的原IP的公用事业.

-   [npm 软件包 (`@arcjet/ip`(中文(简体) )](https://www.npmjs.com/package/@arcjet/ip)
-   [GitHub 源代码 (`ip/` 内 `arcjet/arcjet-js`(中文(简体) )](https://github.com/arcjet/arcjet-js/tree/main/ip)

## 这是什么?

这是帮助我们处理IP地址的内部用途. 它包括从 Rust 标准库代码到解析的代码 [IPv4 和 IPv6 数据](https://github.com/rust-lang/rust/blob/07921b5/library/core/src/net/parser.rs#L34) 并包含一些代码来自 [`pbojinov/request-ip`](https://github.com/pbojinov/request-ip)。 。 。 . 我们把 Rust IP 解析器转换成 TypeScript 这样我们才有完全相同的 两种语言的功能. 替代 JavaScript 库中的类似功能经常使用常规 表达式,但这些可以导致 ReDoS 攻击. 我们回避这个问题,因为 Rust IP 解析算法没有使用 常规表达式. 我们选择了从 `request-ip` 这样我们才能保持功能 我们使用和保持我们的依赖树 尽可能光. 我们的代码是不同的: 如果我们知道我们在Cloudflare上运行 我们不相信通常由 fly.io 设定的头条.

## 我什么时候用这个?

你不应该用这个,而应该用一个替代品. 这个套装符合我们目前的需要 可能与你的不同.

## 安装

这套方案只是无害环境管理. 在 Node.js 用 npm 安装 :

```sh
npm install @arcjet/ip
```

## 使用

```ts
import { findIp } from "@arcjet/ip";

const ip = findIp({ headers: { "x-real-ip": "1.1.1.1" } });
console.log(ip); // => "1.1.1.1"
```

## API 密码

此软件包导出标识符 [`findIp`](https://npmcn.com/package/%40arcjet/ip/#readme-findiprequest-options) 财务报告和审定财务报表 [`parseProxy`](https://npmcn.com/package/%40arcjet/ip/#readme-parseproxyvalue)。 。 。 . 默认导出为 [`findIp`](https://npmcn.com/package/%40arcjet/ip/#readme-findiprequest-options)。 。 。 .

此套件导出 [类型脚本](https://www.typescriptlang.org/) 类型 [`Cidr`](https://npmcn.com/package/%40arcjet/ip/#readme-cidr), (中文(简体) ), [`Options`](https://npmcn.com/package/%40arcjet/ip/#readme-options), (中文(简体) ), [`Platform`](https://npmcn.com/package/%40arcjet/ip/#readme-platform),以及 [`RequestLike`](https://npmcn.com/package/%40arcjet/ip/#readme-requestlike)。 。 。 .

### `Cidr`

此类型代表一个解析的 CIDR 范围, 您可以用作信任的代理 .

###### 类型

```ts
type Cidr = Ipv4Cidr | Ipv6Cidr;
// Where each is an instance roughly equivalent to
// `{bits: number, partSize: 8 | 16, parts: Array<number>, type: "v4" | "v6"}`,
// with a `contains` function that can be passed an array of octets.
```

### `Options`

您可以通过这些选项来配置 `findIp` 查一下客户端IP.

###### 字段

-   `platform` (单位:千美元)[`Platform`](https://npmcn.com/package/%40arcjet/ip/#readme-platform),可选) – 您的代码运行在平台上; 我们只用这个来信任 已知由该平台设定的标题
-   `proxies` (单位:千美元)`Array<Cidr | string>`,可选) ——解决客户端 IP 时要跳过的可信任代理列表

### `Platform`

该类型代表平台名称 `findIp` 承认.

###### 类型

```ts
type Platform = "cloudflare" | "firebase" | "fly-io" | "render" | "vercel";
```

### `RequestLike`

此类型代表了类似请求的对象 `findIp` 可以提取一个 IP 地址从。 它支持几个形状 因为不同的平台暴露 请求不同的信息.

###### 字段

-   `headers` (单位:千美元)`Headers | Record<string, Array<string> | string | undefined>`(中文(简体) ) 请求头
-   `info` (单位:千美元)`{remoteAddress?: string}`,可选) ——一些平台在此传递连接信息
-   `ip` (单位:千美元)`unknown`,可选) ——一些平台在请求对象上直接提供IP
-   `requestContext` (单位:千美元)`{identity?: {sourceIp?: string}}`,可选) ——一些平台通过带有身份信息的请求上下文
-   `socket` (单位:千美元)`{remoteAddress?: string}`,可选) ——一些平台通过一个带有远程地址的套接字

### `findIp(request[, options])`

从类似请求的对象中查找客户端 IP 地址。 如果你通过一个 `platform` 在选项中,我们只信任已知被设定的标题 在那个平台旁边.

###### 参数

-   `request` (单位:千美元)[`RequestLike`](https://npmcn.com/package/%40arcjet/ip/#readme-requestlike)(中文(简体) ) ——要求从
-   `options` (单位:千美元)[`Options`](https://npmcn.com/package/%40arcjet/ip/#readme-options),可选) — 平台和可信代理的配置

###### 回返

已找到的 IP 地址 (`string`),或者如果没有 IP 可能是一个空字符串 决定.

### `parseProxy(value)`

将 CIDR 地址串分析为 a [`Cidr`](https://npmcn.com/package/%40arcjet/ip/#readme-cidr) 对象,或返回 如果是一个普通的 IP 地址, 则该值为- 是 。 你可以用这个来构建一个 列表中信任的代理人.

###### 参数

-   `value` (单位:千美元)`string`(中文(简体) ) ——一个IP地址或CIDR范围来解析

###### 回返

一个解析 [`Cidr`](https://npmcn.com/package/%40arcjet/ip/#readme-cidr) 如果值是一个范围,或给定的 `value` 如果是一个普通的IP,则字符串 .

## 考虑因素

IP不应该被信任,因为它在大多数情况下都可以被欺骗,特别是当 通过 `Headers` 对象。 增加月台守卫,如果 平台在 `options` 参数.

如果遇到私人/内部地址,将跳过。 如果只有这些 ,返回空字符串.

## 许可证

[Apache 许可证,2.0版本](http://www.apache.org/licenses/LICENSE-2.0) © [Arcjet实验室股份有限公司.](https://arcjet.com/)

基于 [`Parser` 内 `std::net`](https://github.com/rust-lang/rust/blob/07921b5/library/core/src/net/parser.rs#L34), (中文(简体) ), [`is_global` 打开 `Ipv4Addr`](https://github.com/rust-lang/rust/blob/87e1447/library/core/src/net/ip_addr.rs#L749),以及 [`is_global` 打开 `Ipv6Addr`](https://github.com/rust-lang/rust/blob/87e1447/library/core/src/net/ip_addr.rs#L1453) 从 `rust-lang/rust`, (中文(简体) ), 双重许可证 [麻省理工学院](https://github.com/rust-lang/rust/blob/07921b5/LICENSE-MIT) 财务报告和审定财务报表 [阿帕奇 - 2.0](https://github.com/rust-lang/rust/blob/07921b5/LICENSE-APACHE) 捐款者. 我们的工作端口到 TypeScript 这样我们两个都有相同的功能 语言.

基于 [`getClientIp` 从 `request-ip`](https://github.com/pbojinov/request-ip/blob/e1d0f4b/src/index.js#L55) 特许使用 [麻省理工学院](https://github.com/pbojinov/request-ip/blob/e1d0f4b/LICENSE.md) 彼得・博吉诺夫. 我们的工作樱桃只选择我们需要的东西.

## 常见问题

### @arcjet/ip 是什么？

寻找请求原生IP的Arcjet 工具

### 如何安装 @arcjet/ip？

在项目目录运行 npm install @arcjet/ip，或使用 pnpm add / yarn add / bun add。

### @arcjet/ip 支持 TypeScript 吗？

支持。包内自带 TypeScript 类型声明（package\.json 声明了 types 入口），安装后即可获得类型提示，无需再安装 @types 包。

### @arcjet/ip 支持 ESM 还是 CommonJS？

以 ES Module 形式发布，推荐使用 import 引入。在 CommonJS 项目中，Node\.js 20\.19\+ / 22\.12\+ 可以直接 require\(\) 不含顶层 await 的 ES Module，更早的版本需要改用动态 import\(\)。

### @arcjet/ip 需要什么版本的 Node\.js？

package\.json 的 engines 字段要求 Node\.js \>=22\.21\.0 \<23 \|\| \>=24\.5\.0。版本不符时 npm 默认只给出警告，开启 engine-strict 后会拒绝安装。

### @arcjet/ip 可以商用吗？

@arcjet/ip 使用 Apache-2\.0 许可。宽松许可：允许商业使用、修改和再分发，并附带明确的专利授权；分发时需保留许可与 NOTICE 文件，修改过的文件要注明改动。以上为概括，不构成法律意见，请以许可原文为准。

### @arcjet/ip 的下载量有多少？

根据 npm 官方下载统计，@arcjet/ip 在 2026/10/07 – 2026/11/05 这 30 天内被下载 355,529 次，日均约 11,851 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入，适合横向比较热度，不能直接等同于使用人数。

### @arcjet/ip 还在维护吗？

最新版本 1\.15\.0 发布于 2026/10/29（8 天前）；至今共发布 79 个版本，其中过去 12 个月发布了 30 个；首次发布于 2023/12/08。发布频率只是参考信号：功能稳定的工具可能很少需要更新，建议结合源码仓库的 issue 和提交记录判断。

