# chanjs/helper/index.js 工具函数使用文档
本文档详细说明 `chanjs/helper/index.js` 导出的所有工具函数的调用方式、参数说明及使用示例，帮助开发者快速集成和使用这些工具。

## 一、加载器相关（loader.js）
### 1. loaderSort
**功能**：对加载的模块/配置进行排序处理  
**调用方式**：
```javascript
import { loaderSort } from 'chanjs/helper/index.js';

// 示例：对加载的控制器列表排序
const loadList = [{ name: 'user', order: 2 }, { name: 'auth', order: 1 }];
const sortedList = loaderSort(loadList); // 按order升序排列
console.log(sortedList); // [{ name: 'auth', order: 1 }, { name: 'user', order: 2 }]
```
**参数说明**：
- `list` (Array)：需要排序的加载项数组，数组项需包含排序字段（如`order`，具体字段由内部逻辑定义）
- 返回值：排序后的数组

### 2. loadConfig
**功能**：加载项目配置文件（如JSON/JS配置）  
**调用方式**：
```javascript
import { loadConfig } from 'chanjs/helper/index.js';

// 示例：加载指定路径的配置
const config = loadConfig('config/app.js');
console.log(config); // 配置文件导出的内容
```
**参数说明**：
- `path` (String)：配置文件路径（相对/绝对）
- 返回值：配置文件的导出内容

### 3. clearConfigCache
**功能**：清除配置加载的缓存（避免配置修改后读取旧值）  
**调用方式**：
```javascript
import { clearConfigCache } from 'chanjs/helper/index.js';

// 示例：修改配置后清除缓存
clearConfigCache(); // 无参数，直接调用
```
**参数说明**：无参数  
**返回值**：无

### 4. loadController
**功能**：加载指定目录下的控制器文件  
**调用方式**：
```javascript
import { loadController } from 'chanjs/helper/index.js';

// 示例：加载controllers目录下的所有控制器
const controllers = loadController('app/controllers');
console.log(controllers); // 控制器实例/映射对象
```
**参数说明**：
- `dir` (String)：控制器目录路径
- 返回值：加载后的控制器集合（对象/数组，具体格式由内部逻辑定义）

## 二、时间处理（time.js）
### 1. formatTime
**功能**：格式化时间戳/日期对象为指定格式的字符串  
**调用方式**：
```javascript
import { formatTime } from 'chanjs/helper/index.js';

// 示例1：格式化当前时间
const now = new Date();
const timeStr1 = formatTime(now, 'YYYY-MM-DD HH:mm:ss'); // 2024-05-20 14:30:00

// 示例2：格式化时间戳
const timestamp = 1716205800000;
const timeStr2 = formatTime(timestamp, 'YYYY/MM/DD'); // 2024/05/20
```
**参数说明**：
- `time` (Date/Number/String)：待格式化的时间（日期对象/时间戳/时间字符串）
- `format` (String)：格式模板，支持 `YYYY`(年)、`MM`(月)、`DD`(日)、`HH`(时)、`mm`(分)、`ss`(秒)
- 返回值：格式化后的时间字符串

### 2. formatDateFields
**功能**：批量格式化对象中的日期字段（如将时间戳字段转为格式化字符串）  
**调用方式**：
```javascript
import { formatDateFields } from 'chanjs/helper/index.js';

// 示例：格式化对象中的createTime和updateTime字段
const data = {
  id: 1,
  createTime: 1716205800000,
  updateTime: 1716206800000
};
const formattedData = formatDateFields(data, ['createTime', 'updateTime'], 'YYYY-MM-DD');
// { id: 1, createTime: '2024-05-20', updateTime: '2024-05-20' }
```
**参数说明**：
- `obj` (Object)：需要处理的对象
- `fields` (Array)：需要格式化的日期字段名数组
- `format` (String)：时间格式模板（同formatTime）
- 返回值：格式化后的新对象

## 三、缓存相关（cache.js）
### 1. Cache（默认导出类）
**功能**：缓存操作类（支持设置、获取、删除缓存等）  
**调用方式**：
```javascript
import { Cache } from 'chanjs/helper/index.js';

// 示例：实例化并使用缓存
const cache = new Cache();

// 设置缓存（key, value, 过期时间（秒））
cache.set('user_1', { name: '张三' }, 3600);

// 获取缓存
const user = cache.get('user_1');
console.log(user); // { name: '张三' }

// 删除缓存
cache.del('user_1');

// 清空所有缓存
cache.clear();
```
**核心方法**：
- `set(key, value, expire)`：设置缓存，`expire` 为过期时间（秒），可选
- `get(key)`：获取缓存，返回缓存值（无则返回null）
- `del(key)`：删除指定key的缓存
- `clear()`：清空所有缓存

## 四、文件操作（file.js）
### 1. dirname
**功能**：获取文件/路径的目录名（兼容不同系统路径）  
**调用方式**：
```javascript
import { dirname } from 'chanjs/helper/index.js';

// 示例：获取文件的目录路径
const filePath = '/app/controllers/user.js';
const dir = dirname(filePath);
console.log(dir); // /app/controllers
```
**参数说明**：
- `path` (String)：文件/路径字符串
- 返回值：目录名字符串

### 2. delImg
**功能**：删除指定路径的图片文件  
**调用方式**：
```javascript
import { delImg } from 'chanjs/helper/index.js';

// 示例：删除上传的图片
const imgPath = '/uploads/2024/05/avatar.png';
const isDel = delImg(imgPath);
console.log(isDel); // true（删除成功）/false（删除失败）
```
**参数说明**：
- `imgPath` (String)：图片文件路径
- 返回值：Boolean，是否删除成功

### 3. getFileTree
**功能**：生成指定目录的文件树结构（递归遍历）  
**调用方式**：
```javascript
import { getFileTree } from 'chanjs/helper/index.js';

// 示例：生成src目录的文件树
const tree = getFileTree('/app/src');
console.log(tree); 
// 输出示例：{ name: 'src', type: 'dir', children: [{ name: 'utils', type: 'dir', children: [...] }, ...] }
```
**参数说明**：
- `dir` (String)：目标目录路径
- 返回值：Object，文件树结构（包含name、type、children等字段）

### 4. readFileContent
**功能**：读取文件内容（支持文本/JSON格式）  
**调用方式**：
```javascript
import { readFileContent } from 'chanjs/helper/index.js';

// 示例1：读取文本文件
const text = readFileContent('/app/config.txt', 'utf8');
console.log(text); // 文件文本内容

// 示例2：读取JSON文件
const json = readFileContent('/app/config.json', 'json');
console.log(json); // 解析后的JSON对象
```
**参数说明**：
- `filePath` (String)：文件路径
- `type` (String)：读取类型，可选 `utf8`（文本）/`json`（JSON），默认`utf8`
- 返回值：String/Object，文件内容（JSON类型返回解析后的对象）

### 5. saveFileContent
**功能**：写入内容到文件（支持覆盖/追加）  
**调用方式**：
```javascript
import { saveFileContent } from 'chanjs/helper/index.js';

// 示例1：覆盖写入文本
saveFileContent('/app/log.txt', '操作日志：用户登录', 'overwrite');

// 示例2：追加写入文本
saveFileContent('/app/log.txt', '\n操作日志：用户退出', 'append');

// 示例3：写入JSON对象
saveFileContent('/app/data.json', { list: [1,2,3] }, 'json');
```
**参数说明**：
- `filePath` (String)：文件路径
- `content` (String/Object)：写入内容（JSON类型自动序列化）
- `mode` (String)：写入模式，可选 `overwrite`（覆盖）/`append`（追加）/`json`（JSON写入），默认`overwrite`
- 返回值：Boolean，是否写入成功

### 6. isPathSafe
**功能**：校验路径是否安全（防止路径遍历攻击）  
**调用方式**：
```javascript
import { isPathSafe } from 'chanjs/helper/index.js';

// 示例1：安全路径
const safe = isPathSafe('/app/uploads/avatar.png', '/app/uploads');
console.log(safe); // true

// 示例2：危险路径（路径遍历）
const unsafe = isPathSafe('/app/uploads/../config.js', '/app/uploads');
console.log(unsafe); // false
```
**参数说明**：
- `path` (String)：待校验的路径
- `root` (String)：允许的根目录
- 返回值：Boolean，路径是否安全

### 7. getFolders
**功能**：获取指定目录下的所有子目录  
**调用方式**：
```javascript
import { getFolders } from 'chanjs/helper/index.js';

// 示例：获取src目录下的所有子目录
const folders = getFolders('/app/src');
console.log(folders); // ['utils', 'controllers', 'models']
```
**参数说明**：
- `dir` (String)：目标目录路径
- 返回值：Array，子目录名称数组

## 五、HTML处理（html.js）
### 1. htmlDecode
**功能**：HTML实体解码（将`&amp;`/`&lt;`等转为原字符）  
**调用方式**：
```javascript
import { htmlDecode } from 'chanjs/helper/index.js';

// 示例：解码HTML实体
const htmlStr = '&lt;div&gt;张三&amp;李四&lt;/div&gt;';
const rawStr = htmlDecode(htmlStr);
console.log(rawStr); // <div>张三&李四</div>
```
**参数说明**：
- `str` (String)：包含HTML实体的字符串
- 返回值：String，解码后的原始字符串

## 六、IP相关（ip.js）
### 1. getIp
**功能**：从请求对象中获取客户端真实IP（兼容反向代理）  
**调用方式**：
```javascript
import { getIp } from 'chanjs/helper/index.js';
// 示例（Express/Koa框架）
app.get('/', (req, res) => {
  const ip = getIp(req); // Koa需传req.req
  console.log(ip); // 客户端IP，如 192.168.1.100
  res.send(`你的IP：${ip}`);
});
```
**参数说明**：
- `req` (Object)：HTTP请求对象（Express/Koa的req）
- 返回值：String，客户端真实IP

## 七、JWT令牌（jwt.js）
### 1. verifyToken
**功能**：验证JWT令牌的有效性  
**调用方式**：
```javascript
import { verifyToken } from 'chanjs/helper/index.js';

// 示例：验证令牌
const token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...';
try {
  const payload = verifyToken(token); // 内部已配置密钥
  console.log(payload); // 令牌解析后的载荷，如 { userId: 1, exp: 1716300000 }
} catch (err) {
  console.error('令牌无效：', err.message);
}
```
**参数说明**：
- `token` (String)：JWT令牌字符串
- 返回值：Object，令牌载荷（验证失败抛出异常）

### 2. generateToken
**功能**：生成JWT令牌  
**调用方式**：
```javascript
import { generateToken } from 'chanjs/helper/index.js';

// 示例：生成令牌（有效期1小时）
const payload = { userId: 1, username: '张三' };
const token = generateToken(payload, 3600); // 过期时间3600秒
console.log(token); // 生成的JWT字符串
```
**参数说明**：
- `payload` (Object)：令牌载荷（需包含非敏感信息）
- `expire` (Number)：过期时间（秒），默认3600
- 返回值：String，JWT令牌

### 3. setToken
**功能**：设置令牌到响应头/客户端存储（如Cookie）  
**调用方式**：
```javascript
import { setToken } from 'chanjs/helper/index.js';
// 示例（Express框架）
app.post('/login', (req, res) => {
  const token = generateToken({ userId: 1 });
  setToken(res, token); // 将令牌设置到Cookie/响应头
  res.send({ code: 200, msg: '登录成功' });
});
```
**参数说明**：
- `res` (Object)：HTTP响应对象（Express/Koa的res）
- `token` (String)：JWT令牌
- 返回值：无

### 4. getToken
**功能**：从请求中获取JWT令牌（从Header/Cookie）  
**调用方式**：
```javascript
import { getToken } from 'chanjs/helper/index.js';
// 示例（Express框架）
app.get('/profile', (req, res) => {
  const token = getToken(req); // 从Authorization头/Cookie获取
  if (!token) {
    return res.send({ code: 401, msg: '未登录' });
  }
  // 验证令牌...
});
```
**参数说明**：
- `req` (Object)：HTTP请求对象（Express/Koa的req）
- 返回值：String/null，获取到的令牌（无则返回null）

## 八、签名/加密（sign.js）
### 1. signData
**功能**：对数据进行签名（防止篡改）  
**调用方式**：
```javascript
import { signData } from 'chanjs/helper/index.js';

// 示例：对数据签名
const data = { userId: 1, amount: 100 };
const sign = signData(data, 'your-secret-key'); // 传入数据和密钥
console.log(sign); // 生成的签名字符串
```
**参数说明**：
- `data` (Object)：待签名的数据
- `secret` (String)：签名密钥（内部可配置默认密钥）
- 返回值：String，签名字符串

### 2. verifySign
**功能**：验证数据签名的有效性  
**调用方式**：
```javascript
import { verifySign } from 'chanjs/helper/index.js';

// 示例：验证签名
const data = { userId: 1, amount: 100 };
const sign = 'xxx...'; // 前端传入的签名
const isValid = verifySign(data, sign, 'your-secret-key');
console.log(isValid); // true（签名有效）/false（无效）
```
**参数说明**：
- `data` (Object)：原始数据
- `sign` (String)：待验证的签名
- `secret` (String)：签名密钥（需与签名时一致）
- 返回值：Boolean，签名是否有效

### 3. aesEncrypt
**功能**：AES加密数据  
**调用方式**：
```javascript
import { aesEncrypt } from 'chanjs/helper/index.js';

// 示例：加密字符串
const rawData = '敏感信息：123456';
const encrypted = aesEncrypt(rawData, 'aes-secret-key', 'aes-iv'); // 密钥+向量
console.log(encrypted); // 加密后的Base64字符串
```
**参数说明**：
- `data` (String)：待加密数据
- `key` (String)：AES密钥（内部可配置默认）
- `iv` (String)：AES向量（内部可配置默认）
- 返回值：String，加密后的Base64字符串

### 4. aesDecrypt
**功能**：AES解密数据  
**调用方式**：
```javascript
import { aesDecrypt } from 'chanjs/helper/index.js';

// 示例：解密
const encrypted = 'xxx...'; // 加密后的字符串
const decrypted = aesDecrypt(encrypted, 'aes-secret-key', 'aes-iv');
console.log(decrypted); // 原始敏感信息：123456
```
**参数说明**：
- `data` (String)：加密后的Base64字符串
- `key` (String)：AES密钥（需与加密时一致）
- `iv` (String)：AES向量（需与加密时一致）
- 返回值：String，解密后的原始数据

## 九、网络请求（request.js）
### 1. request
**功能**：封装的HTTP请求方法（支持GET/POST等）  
**调用方式**：
```javascript
import { request } from 'chanjs/helper/index.js';

// 示例1：GET请求
request({
  url: 'https://api.example.com/user',
  method: 'GET',
  params: { id: 1 } // URL参数
}).then(res => {
  console.log(res); // 响应数据
}).catch(err => {
  console.error(err);
});

// 示例2：POST请求（JSON数据）
request({
  url: 'https://api.example.com/user',
  method: 'POST',
  data: { name: '张三', age: 20 }, // 请求体
  headers: { 'Content-Type': 'application/json' }
}).then(res => {
  console.log(res);
});
```
**参数说明**：
- `options` (Object)：请求配置
  - `url` (String)：请求地址（必传）
  - `method` (String)：请求方法，默认GET
  - `params` (Object)：URL查询参数
  - `data` (Object/String)：请求体数据
  - `headers` (Object)：请求头
  - `timeout` (Number)：超时时间（毫秒），默认5000
- 返回值：Promise，解析后为响应数据

## 十、数据解析（data-parse.js）
### 1. dataParse
**功能**：通用数据解析（如表单数据/JSON字符串转对象）  
**调用方式**：
```javascript
import { dataParse } from 'chanjs/helper/index.js';

// 示例1：解析JSON字符串
const jsonStr = '{"name":"张三","age":20}';
const obj1 = dataParse(jsonStr, 'json');
console.log(obj1); // { name: '张三', age: 20 }

// 示例2：解析表单字符串
const formStr = 'name=张三&age=20';
const obj2 = dataParse(formStr, 'form');
console.log(obj2); // { name: '张三', age: '20' }
```
**参数说明**：
- `data` (String)：待解析的数据
- `type` (String)：解析类型，可选 `json`/`form`，默认`json`
- 返回值：Object，解析后的对象

### 2. arrToObj
**功能**：将数组转为对象（指定key为属性名）  
**调用方式**：
```javascript
import { arrToObj } from 'chanjs/helper/index.js';

// 示例：将用户数组转为以id为key的对象
const userArr = [{ id: 1, name: '张三' }, { id: 2, name: '李四' }];
const userObj = arrToObj(userArr, 'id');
console.log(userObj); 
// { 1: { id: 1, name: '张三' }, 2: { id: 2, name: '李四' } }
```
**参数说明**：
- `arr` (Array)：源数组
- `key` (String)：作为对象属性名的字段
- 返回值：Object，转换后的对象

### 3. parseJsonFields
**功能**：解析对象中的JSON字符串字段为对象  
**调用方式**：
```javascript
import { parseJsonFields } from 'chanjs/helper/index.js';

// 示例：解析userInfo字段（JSON字符串）
const data = {
  id: 1,
  userInfo: '{"name":"张三","age":20}'
};
const parsedData = parseJsonFields(data, ['userInfo']);
console.log(parsedData.userInfo); // { name: '张三', age: 20 }
```
**参数说明**：
- `obj` (Object)：源对象
- `fields` (Array)：需要解析的字段名数组
- 返回值：Object，解析后的新对象

### 4. buildTree
**功能**：将扁平数组转为树形结构（如分类/菜单）  
**调用方式**：
```javascript
import { buildTree } from 'chanjs/helper/index.js';

// 示例：构建菜单树
const menuArr = [
  { id: 1, name: '系统管理', parentId: 0 },
  { id: 2, name: '用户管理', parentId: 1 },
  { id: 3, name: '角色管理', parentId: 1 }
];
const menuTree = buildTree(menuArr, 'id', 'parentId', 'children');
console.log(menuTree);
// 输出：[{ id: 1, name: '系统管理', parentId: 0, children: [{ id: 2, ... }, { id: 3, ... }] }]
```
**参数说明**：
- `arr` (Array)：扁平数组
- `idKey` (String)：ID字段名，默认'id'
- `parentKey` (String)：父ID字段名，默认'parentId'
- `childrenKey` (String)：子节点字段名，默认'children'
- 返回值：Array，树形结构数组

## 十一、树形结构（tree.js）
### 1. tree
**功能**：通用树形结构生成（简化版buildTree）  
**调用方式**：
```javascript
import { tree } from 'chanjs/helper/index.js';

// 示例：生成分类树
const cateArr = [
  { id: 1, name: '电子产品', parentId: 0 },
  { id: 2, name: '手机', parentId: 1 }
];
const cateTree = tree(cateArr);
console.log(cateTree); // 树形结构数组
```
**参数说明**：
- `arr` (Array)：扁平数组（默认id/parentId字段）
- 返回值：Array，树形结构数组

### 2. treeById
**功能**：根据ID查找树形结构中的节点  
**调用方式**：
```javascript
import { treeById } from 'chanjs/helper/index.js';

// 示例：查找ID为2的节点
const cateTree = [/* 树形结构数组 */];
const node = treeById(cateTree, 2);
console.log(node); // { id: 2, name: '手机', parentId: 1 }
```
**参数说明**：
- `tree` (Array)：树形结构数组
- `id` (Number/String)：节点ID
- 返回值：Object/null，找到的节点（无则返回null）

## 十二、字段过滤（filter.js）
### 1. filterFields
**功能**：过滤对象中的字段（保留/排除指定字段）  
**调用方式**：
```javascript
import { filterFields } from 'chanjs/helper/index.js';

// 示例1：保留指定字段
const user = { id: 1, name: '张三', password: '123456', age: 20 };
const userSafe = filterFields(user, ['id', 'name', 'age'], 'keep');
console.log(userSafe); // { id: 1, name: '张三', age: 20 }

// 示例2：排除指定字段
const userNoPwd = filterFields(user, ['password'], 'exclude');
console.log(userNoPwd); // { id: 1, name: '张三', age: 20 }
```
**参数说明**：
- `obj` (Object)：源对象
- `fields` (Array)：字段名数组
- `mode` (String)：过滤模式，`keep`（保留）/`exclude`（排除），默认'keep'
- 返回值：Object，过滤后的新对象

## 十三、响应格式化（response.js）
### 1. success
**功能**：生成成功响应格式  
**调用方式**：
```javascript
import { success } from 'chanjs/helper/index.js';

// 示例：返回成功响应
const resData = success({ data: { list: [1,2,3] }, msg: '操作成功' });
console.log(resData); 
// 输出：{ code: 200, msg: '操作成功', data: { list: [1,2,3] } }
```
**参数说明**：
- `options` (Object)：
  - `data` (Any)：响应数据，默认{}
  - `msg` (String)：提示信息，默认'操作成功'
  - `code` (Number)：状态码，默认200
- 返回值：Object，成功响应对象

### 2. fail
**功能**：生成失败响应格式  
**调用方式**：
```javascript
import { fail } from 'chanjs/helper/index.js';

// 示例：返回失败响应
const resData = fail({ msg: '参数错误', code: 400 });
console.log(resData); 
// 输出：{ code: 400, msg: '参数错误', data: {} }
```
**参数说明**：
- `options` (Object)：
  - `msg` (String)：错误提示，默认'操作失败'
  - `data` (Any)：附加数据，默认{}
  - `code` (Number)：错误码，默认201
- 返回值：Object，失败响应对象

### 3. error
**功能**：生成服务器错误响应格式  
**调用方式**：
```javascript
import { error } from 'chanjs/helper/index.js';

// 示例：返回服务器错误响应
const resData = error({ msg: '数据库查询失败' });
console.log(resData); 
// 输出：{ code: 500, msg: '数据库查询失败', data: {} }
```
**参数说明**：
- `options` (Object)：
  - `msg` (String)：错误提示，默认'服务器内部错误'
  - `data` (Any)：附加数据，默认{}
- 返回值：Object，错误响应对象（默认code=500）

### 4. parseDatabaseError
**功能**：解析数据库错误信息（格式化报错）  
**调用方式**：
```javascript
import { parseDatabaseError } from 'chanjs/helper/index.js';

// 示例：解析数据库异常
try {
  // 数据库操作...
} catch (err) {
  const errInfo = parseDatabaseError(err);
  console.log(errInfo); // { msg: '主键冲突', code: 'ER_DUP_ENTRY' }
}
```
**参数说明**：
- `err` (Error)：数据库抛出的异常对象
- 返回值：Object，解析后的错误信息（msg/code）

### 5. notFoundResponse
**功能**：生成404响应格式  
**调用方式**：
```javascript
import { notFoundResponse } from 'chanjs/helper/index.js';

// 示例：返回404响应
const resData = notFoundResponse({ msg: '资源不存在' });
console.log(resData); 
// 输出：{ code: 404, msg: '资源不存在', data: {} }
```
**参数说明**：
- `options` (Object)：
  - `msg` (String)：提示信息，默认'请求资源不存在'
- 返回值：Object，404响应对象

### 6. errorResponse
**功能**：通用错误响应生成（自定义码和信息）  
**调用方式**：
```javascript
import { errorResponse } from 'chanjs/helper/index.js';

// 示例：生成自定义错误响应
const resData = errorResponse(403, '无访问权限', { userId: 1 });
console.log(resData); 
// 输出：{ code: 403, msg: '无访问权限', data: { userId: 1 } }
```
**参数说明**：
- `code` (Number)：错误码
- `msg` (String)：错误提示
- `data` (Any)：附加数据，默认{}
- 返回值：Object，自定义错误响应对象

## 十四、内容检查（checker.js）
### 1. checkKeywords
**功能**：检查文本中是否包含敏感关键词  
**调用方式**：
```javascript
import { checkKeywords } from 'chanjs/helper/index.js';

// 示例：检查内容是否含敏感词
const content = '这是一条包含敏感词的内容';
const { isIllegal, keywords } = checkKeywords(content);
console.log(isIllegal); // true（包含敏感词）/false
console.log(keywords); // ['敏感词']（检测到的敏感词）
```
**参数说明**：
- `text` (String)：待检查的文本
- 返回值：Object，{ isIllegal: Boolean, keywords: Array }

### 2. isIgnored
**功能**：检查内容是否属于忽略项（如白名单/过滤规则）  
**调用方式**：
```javascript
import { isIgnored } from 'chanjs/helper/index.js';

// 示例：检查用户ID是否在忽略列表
const userId = 1;
const isIgnore = isIgnored(userId, 'user_ignore_list'); // 指定忽略规则名称
console.log(isIgnore); // true（忽略）/false（不忽略）
```
**参数说明**：
- `value` (Any)：待检查的值
- `rule` (String)：忽略规则名称（内部配置的规则标识）
- 返回值：Boolean，是否忽略

## 十五、XSS过滤（xss-filter.js）
### 1. filterXSS
**功能**：过滤文本中的XSS攻击脚本  
**调用方式**：
```javascript
import { filterXSS } from 'chanjs/helper/index.js';

// 示例：过滤XSS脚本
const unsafeText = '<script>alert("xss")</script> <div>正常内容</div>';
const safeText = filterXSS(unsafeText);
console.log(safeText); // &lt;script&gt;alert("xss")&lt;/script&gt; <div>正常内容</div>
```
**参数说明**：
- `text` (String)：待过滤的文本
- 返回值：String，过滤后的安全文本

## 十六、限流中间件（rate-limit.js）
### 1. createRateLimitMiddleware
**功能**：创建接口限流中间件（防止高频请求）  
**调用方式**：
```javascript
import { createRateLimitMiddleware } from 'chanjs/helper/index.js';
import express from 'express';
const app = express();

// 示例：创建限流中间件（每分钟最多100次请求）
const rateLimit = createRateLimitMiddleware({
  windowMs: 60 * 1000, // 时间窗口（毫秒）
  max: 100, // 窗口内最大请求数
  message: { code: 429, msg: '请求过于频繁，请稍后再试' }
});

// 应用到所有接口
app.use(rateLimit);

// 或应用到单个接口
app.get('/api/user', rateLimit, (req, res) => {
  res.send('用户信息');
});
```
**参数说明**：
- `options` (Object)：限流配置
  - `windowMs` (Number)：时间窗口（毫秒），默认60000
  - `max` (Number)：窗口内最大请求数，默认100
  - `message` (Object)：限流提示响应，默认{ code: 429, msg: '请求频繁' }
  - `keyGenerator` (Function)：生成限流标识的函数（默认取IP）
- 返回值：Function，中间件函数（适配Express/Koa）

## 注意事项
1. 所有工具函数的默认配置（如密钥、超时时间等）可在对应子文件（如jwt.js、sign.js）中调整；
2. 涉及加密/签名的函数，建议使用项目自定义密钥，避免使用默认值；
3. 中间件类函数（如createRateLimitMiddleware）需适配对应Web框架（Express/Koa）；
4. 文件操作函数需注意路径权限，避免因权限问题导致读写失败；
5. 所有异步函数（如request）返回Promise，需使用async/await或.then()处理。