乐闻世界logo
搜索文章和话题

whistle 的 Values 功能是什么,如何使用和管理 Values?

2月21日 16:26

答案

Whistle 提供了强大的 Values 功能,可以存储和管理各种配置数据,在规则中灵活使用。

Values 基础

1. 什么是 Values

Values 是 whistle 提供的一种数据存储机制,可以存储:

  • 配置数据
  • 模拟数据
  • 常量值
  • 环境变量

2. Values 文件格式

Values 文件支持多种格式:

  • JSON 格式values.json
  • Properties 格式values.properties
  • INI 格式values.ini
  • YAML 格式values.yaml

创建和使用 Values

1. 创建 JSON 格式的 Values

创建文件:values.json

json
{ "local-host": "127.0.0.1", "local-port": "3000", "test-host": "test.example.com", "test-port": "8080", "api-base": "https://api.example.com", "timeout": "5000", "retry-count": "3" }

在规则中使用:

shell
www.example.com host {{local-host}}:{{local-port}} api.example.com forward {{api-base}}

2. 创建 Properties 格式的 Values

创建文件:values.properties

shell
local.host=127.0.0.1 local.port=3000 test.host=test.example.com test.port=8080 api.base=https://api.example.com timeout=5000 retry.count=3

在规则中使用:

shell
www.example.com host {{local.host}}:{{local.port}} api.example.com forward {{api.base}}

3. 创建 INI 格式的 Values

创建文件:values.ini

ini
[local] host=127.0.0.1 port=3000 [test] host=test.example.com port=8080 [api] base=https://api.example.com timeout=5000 retry=3

在规则中使用:

shell
www.example.com host {{local.host}}:{{local.port}} api.example.com forward {{api.base}}

Values 高级用法

1. 嵌套对象

创建嵌套的 Values:

json
{ "servers": { "local": { "host": "127.0.0.1", "port": "3000" }, "test": { "host": "test.example.com", "port": "8080" } }, "api": { "base": "https://api.example.com", "version": "v1" } }

在规则中使用:

shell
www.example.com host {{servers.local.host}}:{{servers.local.port}} api.example.com forward {{api.base}}/{{api.version}}

2. 数组数据

创建包含数组的 Values:

json
{ "allowed-origins": [ "https://www.example.com", "https://test.example.com", "https://localhost:3000" ], "api-endpoints": [ "/api/user", "/api/list", "/api/detail" ] }

在规则中使用:

shell
# 使用数组的第一个元素 www.example.com resHeaders://{cors-{{allowed-origins.0}}.json}

3. 环境变量

创建环境变量 Values:

json
{ "env": "development", "api-url": "https://dev-api.example.com", "debug": true }

在规则中使用:

shell
# 根据环境变量配置 www.example.com forward {{api-url}} www.example.com reqHeaders://{debug-{{debug}}.json}

Values 在脚本中的使用

1. 在 reqScript 中使用

创建脚本:use-values.js

javascript
const values = require('./values.json'); module.exports = function(req, res) { // 使用 Values 中的数据 const timeout = values.timeout || 5000; const retryCount = values['retry-count'] || 3; req.headers['X-Timeout'] = timeout; req.headers['X-Retry-Count'] = retryCount; };

配置规则:

shell
www.example.com reqScript://{use-values.js}

2. 在 resScript 中使用

创建脚本:use-values-res.js

javascript
const values = require('./values.json'); module.exports = function(req, res) { const originalEnd = res.end; res.end = function(chunk, encoding) { if (chunk) { const body = chunk.toString(); const jsonData = JSON.parse(body); // 使用 Values 中的数据 jsonData.apiVersion = values.api.version; jsonData.environment = values.env; originalEnd.call(res, JSON.stringify(jsonData), encoding); } else { originalEnd.call(res, chunk, encoding); } }; };

配置规则:

shell
www.example.com resScript://{use-values-res.js}

3. 在插件中使用

创建插件:values-plugin.js

javascript
const fs = require('fs'); const path = require('path'); module.exports = function(server, options) { // 读取 Values 文件 const valuesPath = path.join(__dirname, 'values.json'); const values = JSON.parse(fs.readFileSync(valuesPath, 'utf8')); server.on('request', function(req, res) { // 使用 Values 中的数据 req.values = values; // 根据环境变量处理请求 if (values.env === 'development') { req.headers['X-Debug'] = 'true'; } }); };

Values 管理技巧

1. 多环境 Values

创建不同环境的 Values 文件:

values-dev.json:

json
{ "env": "development", "api-url": "https://dev-api.example.com", "debug": true }

values-test.json:

json
{ "env": "testing", "api-url": "https://test-api.example.com", "debug": true }

values-prod.json:

json
{ "env": "production", "api-url": "https://api.example.com", "debug": false }

切换环境:

bash
# 使用开发环境 cp values-dev.json values.json # 使用测试环境 cp values-test.json values.json # 使用生产环境 cp values-prod.json values.json

2. Values 文件组织

按功能模块组织:

api-values.json:

json
{ "api-base": "https://api.example.com", "api-version": "v1", "timeout": "5000" }

cors-values.json:

json
{ "allowed-origins": [ "https://www.example.com", "https://test.example.com" ], "allowed-methods": [ "GET", "POST", "PUT", "DELETE" ] }

在规则中使用:

shell
api.example.com forward {{api-values.api-base}}/{{api-values.api-version}} www.example.com resHeaders://{cors-values.json}

3. Values 版本控制

使用 Git 管理 Values 文件:

bash
# 初始化 Git 仓库 git init # 添加 Values 文件 git add values.json # 提交 git commit -m "Add values configuration" # 推送到远程仓库 git push origin main

Values 最佳实践

1. 命名规范

  • 使用小写字母和连字符:local-host
  • 使用有意义的名称:api-base-url
  • 避免使用特殊字符

2. 数据类型

  • 字符串:用引号包裹
  • 数字:直接使用
  • 布尔值:使用 truefalse
  • 数组:使用方括号
  • 对象:使用花括号

3. 注释说明

在 Values 文件中添加注释:

json
{ "local-host": "127.0.0.1", "local-port": "3000", "api-base": "https://api.example.com", "timeout": "5000" }

创建配套的 README 文件:

markdown
# Values 配置说明 ## 配置项说明 - `local-host`: 本地服务器地址 - `local-port`: 本地服务器端口 - `api-base`: API 基础地址 - `timeout`: 请求超时时间(毫秒) ## 使用方法 在 whistle 规则中使用 `{{key}}` 引用配置项。

4. 安全考虑

  • 不要在 Values 中存储敏感信息
  • 使用环境变量管理敏感数据
  • 定期更新 Values 文件

Values 实战示例

1. 动态配置代理

创建 Values:

json
{ "proxy": { "enabled": true, "host": "127.0.0.1", "port": "8080" } }

配置规则:

shell
{{#if proxy.enabled}} www.example.com host {{proxy.host}}:{{proxy.port}} {{/if}}

2. 多域名配置

创建 Values:

json
{ "domains": { "www": "www.example.com", "api": "api.example.com", "static": "static.example.com" }, "servers": { "local": "127.0.0.1:3000", "test": "test.example.com:8080" } }

配置规则:

shell
{{domains.www}} host {{servers.local}} {{domains.api}} forward https://{{servers.test}} {{domains.static}} host {{servers.local}}

3. 条件配置

创建 Values:

json
{ "features": { "new-feature": true, "beta-feature": false } }

配置规则:

shell
{{#if features.new-feature}} www.example.com/new-feature resBody://{new-feature.json} {{/if}} {{#if features.beta-feature}} www.example.com/beta resBody://{beta-feature.json} {{/if}}
标签:Whistle