前端2026年5月27日 21:56
whistle 代理工具有哪些应用场景?## 答案
Whistle 是基于 Node.js 的跨平台 Web 调试代理工具,通过规则文本拦截和修改 HTTP/HTTPS 请求与响应。相比直接改代码或配 hosts,核心优势是**不改代码、不切环境、规则可复用且仅对本地生效**。
前端开发中最常用的五个场景:
### 本地联调
将线上域名指向本地开发服务,省去切环境或改代码:
```bash
api.example.com host 127.0.0.1:3000
```
联调只影响你自己,其他同事访问线上不受干扰。多个后端服务可同时指向不同本地端口:
```bash
api.example.com host 127.0.0.1:3000
pay.example.com host 127.0.0.1:4000
```
需要同时联调 WebSocket 时也没问题,whistle 默认支持 ws/wss 协议代理。
### 接口 Mock
后端接口未就绪时,用本地 JSON 文件返回模拟数据:
```bash
api.example.com/user resBody://{mock-user.json}
```
在 Whistle 的 Values 面板中创建 `mock-user.json`,写入模拟响应体即可。也可以直接指定状态码:
```bash
api.example.com/error resStatus://500
```
用 `resDelay://3000` 模拟接口超时,验证前端的 loading 和兜底逻辑。需要按条件 Mock 时,用 `resScript` 编写动态逻辑:
```javascript
// timeout.js — 支付接口模拟 5 秒超时
if (rules.requestHeaders.referer && rules.requestHeaders.referer.indexOf('/pay') !== -1) {
rules.responseDelay = 5000;
rules.responseStatus = 504;
}
```
### 跨域处理
开发阶段给响应注入 CORS 头,绕过浏览器同源限制:
```bash
api.example.com resHeaders://{cors.json}
```
`cors.json` 内容示例:
```json
{
"access-control-allow-origin": "*",
"access-control-allow-methods": "GET,POST,PUT,DELETE,OPTIONS",
"access-allow-headers": "Content-Type,Authorization"
}
```
比后端加跨域配置更安全——只有你自己生效,不会影响线上环境。
### 移动端抓包与调试
手机配代理指向电脑 IP:8899,安装根证书后可捕获 HTTPS 请求:
1. 手机 Wi-Fi 设置中配置 HTTP 代理,服务器填电脑 IP,端口填 8899
2. 手机浏览器访问 `ip:8899`,下载并安装根证书
3. iOS 需在"设置 → 通用 → 关于本机 → 证书信任设置"中手动启用信任
4. Android 7+ 默认不信任用户证书,需用 `whistle.startProxy(8899, true)` 开启全局代理或 root 后安装到系统证书目录
配合内置 weinre 远程调试移动端页面 DOM 和控制台:
```bash
m.example.com weinre://debug
```
也可以安装 `whistle.inspect` 插件注入 vConsole/Eruda,在 App 内直接查看调试面板:
```bash
npm i -g whistle.inspect
m.example.com whistle.inspect://vconsole
```
### 异常场景模拟
用规则快速构造边界条件,测试前端兜底逻辑:
```bash
# 模拟接口延迟 3 秒
api.example.com/api resDelay://3000
# 模拟 500 错误
api.example.com/api resStatus://500
# 模拟弱网(限速 30kb/s)
api.example.com/api reqSpeed://30
```
复杂条件用 `resScript` 处理,简单场景一条规则就够。
### 规则管理建议
- 用 `# 注释` 标记每条规则的用途,方便团队协作
- JSON 数据统一放在 Values 面板管理,别直接内联在规则里
- 调试完及时关闭代理并移除证书,防止隐私泄露和证书风险
- 善用 `ignore://*` 跳过不需要代理的请求,减少干扰
## 追问
- **whistle 和 Charles/Fiddler 的区别?** —— whistle 免费开源、基于规则文本配置(可版本管理)、支持 Node 插件扩展;Charles/Fiddler 偏 GUI 操作,Charles 收费且仅 macOS/Windows,Fiddler 仅 Windows。whistle 天然跨平台且规则可团队共享。
- **如何让 whistle 代理 HTTPS 请求?** —— 需要安装并信任 whistle 的根证书:在 Whistle 界面点击 HTTPS → 安装根证书,桌面端安装到系统钥匙串/iOS 信任设置中并启用信任,Android 7+ 用户证书默认不被信任需特殊处理。浏览器和系统层面都需要配置信任。
- **SwitchyOmega 和 whistle 是什么关系?** —— SwitchyOmega 是浏览器代理切换插件,负责把浏览器流量导向 whistle 所在的地址和端口;whistle 负责具体的规则匹配和请求处理。两者配合:SwitchyOmega 控制哪些流量走代理,whistle 决定代理后怎么处理。
- **whistle 规则的优先级是什么?** —— 默认从上到下匹配,先匹配到的规则优先。可用 `enable://proxyFirst` 改为代理优先模式。`ignore://` 规则会跳过所有其他规则,优先级最高。同名规则后写的会覆盖前面的。
- **whistle 插件有什么用?** —— 通过 Node 模块扩展功能,如 `whistle.inspect` 注入 vConsole/Eruda、`whistle.vase` 做接口录制回放、`whistle.autocoder` 自动生成规则。安装后 `w2 restart` 即可使用。标签
Whistle
Whistle Proxy 是一个开源的网络调试代理工具,主要用于捕获和修改 HTTP(S) 网络请求。它支持多种平台,包括 Windows、Mac 和 Linux。Whistle Proxy 常被用于前端开发和测试中,以调试和优化应用程序的网络请求。

前端2026年5月27日 21:46
whistle 如何支持 WebSocket 代理和调试?## 核心答案
Whistle 基于代理机制自动拦截 WebSocket 连接,在 Network 面板的 Frames 标签中实时展示收发消息,配合规则可以实现暂停、忽略、Mock 等调试操作。
具体分三步:
**1. 抓包查看消息**
设置代理后,Whistle 自动捕获 ws/wss 请求。在 Network 面板选中该请求,切换到 Frames 标签即可看到实时消息流,JSON 消息会自动格式化。
**2. 用规则控制连接行为**
```
# 暂停接收服务端消息
ws://example.com enable://pauseReceive
# 暂停发送客户端消息
ws://example.com enable://pauseSend
# 忽略收发(不转发)
ws://example.com enable://ignoreReceive
ws://example.com enable://ignoreSend
```
**3. 用 Composer 构造和发送消息**
在 Frames 面板底部有 Composer 区域,可以直接向服务端或客户端发送自定义文本/JSON 数据,用于模拟服务端推送或异常响应。
## 追问一:如何修改 WebSocket 消息内容?
Whistle 原生不支持直接改写 WebSocket 消息体,需要借助 `frameScript` 规则或插件:
- **frameScript**:在 Rules 面板配置 `ws://example.com frameScript://{wsModify.js}`,脚本中监听 `onframe` 事件对帧数据做替换
- **插件方式**:安装 `whistle.script` 插件,配置 `ws://example.com script://handleWS`,在脚本中拦截并修改 message
## 追问二:Whistle 如何处理 wss 连接?
和 HTTPS 一样需要安装 Whistle 的根证书。证书装好后,Whistle 通过 MITM 方式解密 wss 流量,抓包和调试方式与 ws 完全一致。
## 追问三:如何 Mock WebSocket 服务端?
用 Composer 手动发消息是最快的方式。如需自动化,可以写插件监听 `upgrade` 事件,在 `server.on('connection')` 回调中按业务逻辑返回 Mock 数据,配置规则指向该插件即可。前端2026年5月27日 21:43
whistle 和 Charles 有什么区别,如何选择使用?## 核心结论
Whistle 开源免费、规则灵活、扩展性强,适合日常高频调试的前端开发者;Charles 图形界面友好、开箱即用,适合偶尔抓包或不熟悉命令行的用户。两者都是 HTTP/HTTPS 调试代理,但设计理念不同:Whistle 靠规则配置驱动,Charles 靠可视化操作驱动。
## 关键差异
| 维度 | Whistle | Charles |
|------|---------|---------|
| 开源与费用 | 完全开源免费 | 商业软件,$50/许可证 |
| 技术栈 | Node.js,npm 安装 | Java,独立安装包 |
| 配置方式 | 规则语法(类似 hosts),可脚本化 | 图形界面点选操作 |
| 协议支持 | HTTP/HTTPS/WebSocket/TCP | HTTP/HTTPS |
| 插件生态 | npm 插件,可注入 JS/CSS/vConsole | 内置功能为主,扩展有限 |
| 移动端抓包 | 需手动配代理+装证书,规则可共享 | 同样需配代理,界面操作更直观 |
| Mock 能力 | 规则指定接口固定返回,不会超时 | Map Local/Rewrite 实现,配置稍繁琐 |
## 选 Whistle 的典型场景
- **团队协作**:规则文件可纳入 Git 版本控制,新人拉取即用
- **频繁 Mock**:前端联调时给接口固定回参,避免后端未就绪导致阻塞
- **注入调试**:通过插件往页面注入 vConsole、eruda 等移动端调试工具
- **预算有限**:个人项目或小团队不想付费
## 选 Charles 的典型场景
- **临时抓包**:偶尔排查一个接口问题,打开就能用
- **带宽限速测试**:内置 Throttle 功能,模拟弱网环境更方便
- **AJAX 调试**:请求/响应结构化展示清晰,搜索匹配可定位到具体字段
- **非技术背景**:产品或测试人员更习惯图形界面
## 追问:能不能两个都用?
可以。日常开发用 Whistle 处理规则和 Mock,遇到需要弱网测试或快速排查时切 Charles。注意两者不能同时监听同一端口,需错开代理端口配置。前端2026年5月27日 21:43
whistle 常见问题有哪些,如何排查和解决?## 核心排查思路
Whistle 常见问题集中在四个环节:**安装启动 → 代理连通 → HTTPS 证书 → 规则生效**。逐层排查即可定位大多数问题。
## 安装启动失败怎么办
安装报 `EACCES` 权限错误,用 `sudo npm i -g whistle` 或改用 nvm 管理 Node 版本。启动报端口占用,先 `w2 stop` 再 `w2 start`,或用 `-p` 指定端口:`w2 start -p 8080`。启动成功但无法访问 `127.0.0.1:8899`,运行 `w2 status` 确认进程存活,再检查防火墙是否放行了对应端口。
## 手机连不上代理怎么排查
确保手机和电脑在同一 Wi-Fi 下,手机代理地址填电脑局域网 IP(不是 127.0.0.1),端口填 whistle 监听端口。电脑防火墙需允许该端口入站连接。仍不通时,用 `curl -x http://电脑IP:端口 http://example.com` 在另一设备验证代理是否可达。
## HTTPS 抓包失败如何解决
这是最高频问题,分两步走:
1. **启用 HTTPS 拦截**:whistle 面板点击 HTTPS → 勾选 Capture HTTPS
2. **安装根证书**:浏览器访问 `rootca.pro` 下载证书,安装到系统"受信任的根证书颁发机构"
iOS 额外步骤:安装描述文件后,还需在"设置 → 通用 → 关于本机 → 证书信任设置"中手动开启信任。Android 7+ 默认不信任用户证书,需 root 或配置 network_security_config。Firefox 使用独立证书库,需单独导入。
## 规则不生效怎么排查
按以下顺序检查:规则语法是否正确 → 是否被注释或被更靠前的规则覆盖 → 是否需要 `w2 restart` 重载 → 浏览器缓存是否干扰(用隐身模式验证)。在 Network 面板查看请求是否经 whistle 转发,未转发则代理配置有误。
## 性能问题如何优化
规则过多或正则过复杂会拖慢响应。精简规则、避免贪婪匹配,必要时 `w2 restart` 释放内存。日志积累过多时清空:Network → Tools → Server 清理即可。
> 追问:应用使用了 SSL Pinning 怎么办?— 用 `域名 disable://capture` 跳过该域名的解密,或借助 Frida/Xposed 绕过证书校验。多实例共存?用不同端口和 `--dirname` 指定独立数据目录启动。前端2026年5月27日 21:38
whistle 的规则语法是什么,常用的操作符有哪些?## 规则语法
Whistle 规则的基本格式为 `pattern operation [lineProps] [filters]`,即"匹配模式 + 操作 + 可选配置"。
当请求 URL 匹配 pattern 时,whistle 对其执行 operation 定义的操作。
## 常用操作符
**修改请求/响应:**
- `reqHeaders`:修改请求头,如 `www.test.com reqHeaders://x-token=abc`
- `resHeaders`:修改响应头,如 `www.test.com resHeaders://{cors.json}`
- `resBody` / `resReplace`:替换响应体或响应内容
**映射与代理:**
- `file`:映射到本地文件,如 `www.test.com/api file://{mock.json}`
- `host`:修改 Host 指向,如 `www.test.com host 127.0.0.1:8080`
- `proxy` / `forward`:通过代理或指定地址转发请求
**脚本与延迟:**
- `reqScript` / `resScript`:用脚本动态处理请求或响应
- `resDelay`:模拟响应延迟,如 `www.test.com resDelay://3000`
## 匹配模式
按模糊程度从精确到宽泛:
1. **精确匹配**:`$www.test.com/api` — 加 `$` 前缀,仅匹配该 URL
2. **路径匹配**:`www.test.com/api` — 匹配该路径下所有请求
3. **通配符匹配**:`*.test.com` 或 `^https://**.test.com/**`
4. **正则匹配**:`/api\/v2/i` — 用正则灵活匹配 URL
## 规则优先级与合并
- 相同 pattern 不同 operation 会合并生效,如 `www.test.com resDelay://3000 file://{data.json}` 同时延迟并返回本地数据
- 相同 pattern 相同 operation 取最前面的规则
- 用 `lineProps://important` 提升单行优先级
- 用 `excludeFilter` / `includeFilter` 对匹配结果二次过滤
## 追问
- Whistle 如何实现只对 POST 请求生效?用 `includeFilter://m:post` 过滤请求方法
- 多条规则冲突时如何排查?看 Rules 面板的匹配日志,或用 `lineProps://important` 调整优先级
- Whistle 和 Charles 的核心区别?Whistle 基于规则文件配置、支持脚本和插件,Charles 偏 GUI 操作前端2026年5月27日 21:36
whistle 如何进行性能监控和分析,有哪些优化建议?## 答案
Whistle 的性能监控和分析主要依赖 Network 面板和规则配置,核心思路是:**抓包看耗时,规则模拟瓶颈,对比验证优化效果。**
### Network 面板分析请求耗时
Whistle 的 Network 面板类似 Chrome DevTools,展示所有经过代理的 HTTP/HTTPS 请求。选中某条请求后,右侧详情面板可查看请求头、响应头、Cookie、耗时等完整信息。通过点击 Timeline 列可切换为时间线视图,直观看到每个请求的起止时间和并发关系,快速定位慢请求。
实际操作中,先按耗时排序找出 Top 慢请求,再逐个分析是 DNS 解析慢、服务端响应慢(TTFB 高),还是资源体积大导致下载慢,针对性优化。
### 弱网模拟测试性能下限
用 `reqDelay` 和 `reqSpeed` 规则模拟弱网:
```
# 延迟 3 秒
www.example.com reqDelay://3000
# 限速 50kb/s
www.example.com reqSpeed://50
```
移动端场景必须做弱网测试。Whistle 的优势在于手机配代理后直接生效,比 Chrome DevTools 的弱网模拟更贴近真实移动环境。
### 规则辅助性能优化验证
**压缩验证**:用 `enable://gzip` 或 `enable://br` 强制开启压缩,对比响应体积变化:
```
www.example.com enable://gzip
```
**缓存测试**:用 `cache://` 规则控制缓存策略,验证缓存头是否生效:
```
www.example.com/static cache://86400
www.example.com/api cache://no-store
```
**资源替换**:用 `resReplace` 替换线上资源为本地优化版本,快速验证优化效果:
```
www.example.com resReplace://old.js local-optimized.js
```
### 实战优化流程
1. 用 Network 面板抓包,按耗时排序找瓶颈
2. 弱网模拟验证最差体验
3. 规则注入压缩/缓存/替换,对比优化前后数据
4. 用 Composer 重放请求,确认优化稳定
Whistle 不是性能监控平台,而是**开发阶段的性能诊断工具**,适合在上线前发现和验证问题,线上监控仍需 RUM 方案。
### 追问
**Q: Whistle 和 Chrome DevTools 的 Network 面板有什么区别?**
Whistle 是独立代理,能抓取手机 App、小程序等非浏览器场景的请求,这是浏览器内嵌工具做不到的。
**Q: 如何用 Whistle 持续监控性能?**
Whistle 本身不支持持续监控,但可以导出 HAR 文件,结合脚本定期采集后做趋势分析。前端2026年5月27日 21:34
whistle 如何解决跨域问题,有哪些常见的跨域场景?## 答案
Whistle 通过 `resCors` 协议一行规则即可解决跨域,无需手写脚本或配置 JSON 文件。
**最常用的三种写法:**
```
# 允许所有源(开发环境推荐)
api.example.com resCors://*
# 仅允许指定源
api.example.com resCors://https://www.myapp.com
# 启用 CORS 并自动回显请求中的 Origin
api.example.com resCors://enable
```
`resCors://enable` 会把响应头 `Access-Control-Allow-Origin` 设为请求携带的 Origin 值,适合需要携带 Cookie 的场景。`resCors://*` 直接设置 `Access-Control-Allow-Origin: *`,浏览器不会发送凭证但足够覆盖大多数调试需求。
如果需要额外控制允许的方法或头部,用 `resHeaders` 补充:
```
api.example.com resCors://* resHeaders://{cors-extra.json}
```
另一种思路是代理到同源:通过 whistle 将前端和 API 映射到同一域名下,从根源消除跨域:
```
my.app.com/api api.example.com
my.app.com 127.0.0.1:3000
```
## 常见跨域场景
**本地调试:** 前端跑在 `localhost:3000`,后端在 `api.example.com`,加一条 `resCors://*` 即可。
**多子域名:** `www.example.com` 访问 `api.example.com`,用 `resCors://https://www.example.com` 限定来源。
**携带凭证:** 需要带 Cookie 时必须指定具体源,用 `resCors://enable` 或 `resCors://https://www.myapp.com`,不能使用 `*`。
**线上排查:** 结合 SwitchyOmega 将流量导到 whistle,用 `resCors://enable` 临时放开,抓完即关。
## 追问
- **resCors 和 resHeaders 手动加 CORS 头有什么区别?** `resCors` 是 whistle 内置协议,会同时处理预检请求(OPTIONS)的响应;手动加头容易遗漏 `Access-Control-Max-Age` 等字段,导致频繁预检。
- **生产环境能用 whistle 解决跨域吗?** 不能。whistle 是开发调试工具,生产环境应由 Nginx 或后端服务配置 CORS 策略。
- **Cookie 跨域为什么不能用 `*`?** 浏览器规范要求 `Access-Control-Allow-Credentials: true` 时 Origin 不能为 `*`,否则请求直接失败。前端2026年5月27日 21:33
whistle 常用的命令行操作有哪些?## 核心命令
Whistle 的命令行操作都通过 `w2` 命令完成,常用命令如下:
- `w2 start` — 启动服务,默认监听 8899 端口
- `w2 start -p 8080` — 指定端口启动
- `w2 start -S storageName` — 指定存储目录,用于多实例管理
- `w2 start -n user -w pass` — 设置管理界面的登录用户名和密码
- `w2 stop` — 停止服务
- `w2 restart` — 重启服务
- `w2 status` — 查看运行状态
- `w2 proxy` — 设置系统代理
- `w2 proxy 0` — 关闭系统代理
- `w2 ca` — 安装 HTTPS 根证书(抓 HTTPS 请求必须)
- `w2 -h` — 查看帮助
安装只需 `npm i -g whistle`,Mac 用户也可用 `brew install whistle`。
## 多实例管理
需要同时运行多个 whistle 实例时,每个实例必须指定独立的端口和存储目录:
```bash
w2 start -p 8010 -S 8010
w2 start -p 8020 -S 8020
```
建议端口和存储目录使用相同编号,便于管理。
## 启动进阶参数
- `--httpsPort 8001` — 启用 HTTPS 代理端口
- `--socksPort 1080` — 启用 SOCKSv5 代理端口
- `-P 8889` — 单独设置管理界面端口
- `--inspect` — 开启 Node.js 调试(默认 9229 端口)
- `--config /path/to/config.json` — 从配置文件加载参数
## 追问:如何在命令行快速切换代理环境?
通过 `-S` 指定不同存储目录,每个目录维护独立的规则集。脚本化切换:
```bash
#!/bin/bash
w2 stop
w2 start -p 8899 -S $1
```
执行 `./switch.sh dev` 即可切换到 dev 环境的规则,无需手动编辑配置。前端2026年5月27日 21:30
如何使用 whistle 拦截 HTTPS 请求,证书如何配置?## 答案
whistle 作为本地代理,对 HTTPS 请求执行中间人解密:收到客户端 CONNECT 后,用自签 RootCA 为目标域名动态签发证书,再以该证书与客户端建立 TLS 连接,明文拿到请求内容后转发给真实服务器。要让客户端信任这些动态证书,必须把 whistle 的 RootCA 装进系统或浏览器的信任链。
## 证书配置
1. 启动并打开管理界面
```bash
npm i -g whistle && w2 start
```
浏览器访问 `http://127.0.0.1:8899`。
2. 下载根证书
管理界面点击 HTTPS 标签,下载 RootCA。
3. 安装到系统信任链
- **Mac**:钥匙串访问 → 导入 → 双击设为"始终信任"
- **Windows**:双击证书 → 安装到"本地计算机" → 放入"受信任的根证书颁发机构"
- **Linux**:`sudo cp rootCA.crt /usr/local/share/ca-certificates/ && sudo update-ca-certificates`
4. 开启拦截
勾选 HTTPS 面板的 "Capture HTTPS CONNECTs";只想拦截特定域名用规则 `example.com filter://intercept`。
## 移动端
手机连同一 Wi-Fi,浏览器访问 `http://rootca.pro` 下载证书,系统设置中信任该证书,再将手机代理指向电脑 IP:8899。
## 踩坑点
- **Android 7+**:应用默认不信任用户证书,需 root 或配置 network_security_config
- **iOS 10.3+**:安装后还得到 设置 → 通用 → 关于本机 → 证书信任设置 手动开启
- **Firefox**:独立证书库,需在 about:preferences 单独导入 RootCA
- **证书锁定**:部分 App 校验服务器证书指纹,代理无法拦截
## 追问
- whistle 拦截 HTTPS 的原理?——中间人代理 + 动态签发证书
- 如何只拦截特定域名?——`filter://intercept` 规则
- Android 高版本为什么抓不到包?——用户证书信任域变更前端2月21日 16:26
如何开发 whistle 插件,插件的基本结构是什么?## 答案
Whistle 支持插件系统,可以通过开发插件来扩展其功能,实现自定义的网络请求处理逻辑。
### 插件开发基础
#### 1. 创建插件项目
```bash
mkdir whistle-plugin-demo
cd whistle-plugin-demo
npm init -y
```
#### 2. 创建插件入口文件
创建 `index.js` 文件:
```javascript
module.exports = function(server, options) {
// 插件初始化逻辑
console.log('Whistle plugin demo loaded');
// 监听请求事件
server.on('request', function(req, res) {
// 处理请求
if (req.url === '/api/plugin-demo') {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify({
message: 'Hello from whistle plugin',
timestamp: Date.now()
}));
}
});
// 监听响应事件
server.on('response', function(req, res) {
// 处理响应
console.log('Response:', req.url, res.statusCode);
});
};
```
#### 3. 配置 package.json
```json
{
"name": "whistle-plugin-demo",
"version": "1.0.0",
"description": "A demo whistle plugin",
"main": "index.js",
"whistleConfig": {
"name": "demo",
"description": "Demo plugin for whistle"
}
}
```
### 插件功能实现
#### 1. 请求拦截和修改
```javascript
module.exports = function(server, options) {
server.on('request', function(req, res) {
// 修改请求头
req.headers['X-Custom-Header'] = 'Custom Value';
// 记录请求信息
console.log('Request URL:', req.url);
console.log('Request Method:', req.method);
console.log('Request Headers:', req.headers);
});
};
```
#### 2. 响应拦截和修改
```javascript
module.exports = function(server, options) {
server.on('response', function(req, res) {
// 修改响应头
res.setHeader('X-Response-Header', 'Custom Response');
// 修改响应体
const originalEnd = res.end;
res.end = function(chunk, encoding) {
if (chunk) {
const body = chunk.toString();
const modifiedBody = body.replace(/old/g, 'new');
originalEnd.call(res, modifiedBody, encoding);
} else {
originalEnd.call(res, chunk, encoding);
}
};
});
};
```
#### 3. 中间件模式
```javascript
module.exports = function(server, options) {
// 使用 Express 风格的中间件
server.use(function(req, res, next) {
console.log('Middleware:', req.url);
next();
});
// 路由处理
server.get('/api/test', function(req, res) {
res.json({ success: true });
});
};
```
### 插件配置选项
```javascript
module.exports = function(server, options) {
// 获取插件配置
const customConfig = options.customConfig || {};
const port = options.port || 3000;
console.log('Plugin options:', options);
};
```
### 安装和使用插件
#### 1. 本地安装插件
```bash
cd whistle-plugin-demo
npm link
w2 install demo
```
#### 2. 全局安装插件
```bash
npm install -g whistle-plugin-demo
w2 install demo
```
#### 3. 在规则中使用插件
```
www.example.com plugin://demo
```
### 高级功能
#### 1. WebSocket 支持
```javascript
module.exports = function(server, options) {
server.on('upgrade', function(req, socket, head) {
// 处理 WebSocket 升级请求
console.log('WebSocket upgrade:', req.url);
});
};
```
#### 2. 文件系统操作
```javascript
const fs = require('fs');
const path = require('path');
module.exports = function(server, options) {
server.on('request', function(req, res) {
if (req.url === '/api/file') {
const filePath = path.join(__dirname, 'data.json');
const data = fs.readFileSync(filePath, 'utf8');
res.end(data);
}
});
};
```
#### 3. 数据库集成
```javascript
const mysql = require('mysql');
module.exports = function(server, options) {
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'password',
database: 'test'
});
server.on('request', function(req, res) {
if (req.url === '/api/users') {
connection.query('SELECT * FROM users', function(error, results) {
if (error) {
res.statusCode = 500;
res.end(JSON.stringify({ error: error.message }));
} else {
res.end(JSON.stringify(results));
}
});
}
});
};
```
### 最佳实践
1. **错误处理**
- 添加适当的错误处理逻辑
- 记录错误日志
- 提供友好的错误信息
2. **性能优化**
- 避免阻塞操作
- 使用缓存减少重复计算
- 合理使用异步操作
3. **安全性**
- 验证输入参数
- 防止注入攻击
- 敏感信息加密存储
4. **文档和测试**
- 编写清晰的使用文档
- 添加单元测试
- 提供示例代码