befly 3.9.38 → 3.9.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -38
- package/befly.config.ts +62 -40
- package/checks/checkApi.ts +16 -16
- package/checks/checkApp.ts +19 -25
- package/checks/checkTable.ts +42 -42
- package/docs/README.md +42 -35
- package/docs/{api.md → api/api.md} +223 -231
- package/docs/cipher.md +71 -69
- package/docs/database.md +143 -141
- package/docs/{examples.md → guide/examples.md} +181 -181
- package/docs/guide/quickstart.md +331 -0
- package/docs/hooks/auth.md +38 -0
- package/docs/hooks/cors.md +28 -0
- package/docs/{hook.md → hooks/hook.md} +140 -57
- package/docs/hooks/parser.md +19 -0
- package/docs/hooks/rateLimit.md +47 -0
- package/docs/{redis.md → infra/redis.md} +84 -93
- package/docs/plugins/cipher.md +61 -0
- package/docs/plugins/database.md +128 -0
- package/docs/{plugin.md → plugins/plugin.md} +83 -81
- package/docs/quickstart.md +26 -26
- package/docs/{addon.md → reference/addon.md} +46 -46
- package/docs/{config.md → reference/config.md} +32 -80
- package/docs/{logger.md → reference/logger.md} +52 -52
- package/docs/{sync.md → reference/sync.md} +32 -35
- package/docs/{table.md → reference/table.md} +1 -1
- package/docs/{validator.md → reference/validator.md} +57 -57
- package/hooks/auth.ts +8 -4
- package/hooks/cors.ts +13 -13
- package/hooks/parser.ts +37 -17
- package/hooks/permission.ts +26 -14
- package/hooks/rateLimit.ts +276 -0
- package/hooks/validator.ts +7 -7
- package/lib/asyncContext.ts +43 -0
- package/lib/cacheHelper.ts +212 -77
- package/lib/cacheKeys.ts +38 -0
- package/lib/cipher.ts +30 -30
- package/lib/connect.ts +28 -28
- package/lib/dbHelper.ts +183 -102
- package/lib/jwt.ts +16 -16
- package/lib/logger.ts +610 -19
- package/lib/redisHelper.ts +185 -44
- package/lib/sqlBuilder.ts +90 -91
- package/lib/validator.ts +59 -39
- package/loader/loadApis.ts +48 -44
- package/loader/loadHooks.ts +40 -14
- package/loader/loadPlugins.ts +16 -17
- package/main.ts +57 -47
- package/package.json +47 -45
- package/paths.ts +15 -14
- package/plugins/cache.ts +5 -4
- package/plugins/cipher.ts +3 -3
- package/plugins/config.ts +2 -2
- package/plugins/db.ts +9 -9
- package/plugins/jwt.ts +3 -3
- package/plugins/logger.ts +8 -12
- package/plugins/redis.ts +8 -8
- package/plugins/tool.ts +6 -6
- package/router/api.ts +85 -56
- package/router/static.ts +12 -12
- package/sync/syncAll.ts +12 -12
- package/sync/syncApi.ts +55 -52
- package/sync/syncDb/apply.ts +20 -19
- package/sync/syncDb/constants.ts +25 -23
- package/sync/syncDb/ddl.ts +35 -36
- package/sync/syncDb/helpers.ts +6 -9
- package/sync/syncDb/schema.ts +10 -9
- package/sync/syncDb/sqlite.ts +7 -8
- package/sync/syncDb/table.ts +37 -35
- package/sync/syncDb/tableCreate.ts +21 -20
- package/sync/syncDb/types.ts +23 -20
- package/sync/syncDb/version.ts +10 -10
- package/sync/syncDb.ts +43 -36
- package/sync/syncDev.ts +74 -65
- package/sync/syncMenu.ts +190 -55
- package/tests/api-integration-array-number.test.ts +282 -0
- package/tests/befly-config-env.test.ts +78 -0
- package/tests/cacheHelper.test.ts +135 -104
- package/tests/cacheKeys.test.ts +41 -0
- package/tests/cipher.test.ts +90 -89
- package/tests/dbHelper-advanced.test.ts +140 -134
- package/tests/dbHelper-all-array-types.test.ts +316 -0
- package/tests/dbHelper-array-serialization.test.ts +258 -0
- package/tests/dbHelper-columns.test.ts +56 -55
- package/tests/dbHelper-execute.test.ts +45 -44
- package/tests/dbHelper-joins.test.ts +124 -119
- package/tests/fields-redis-cache.test.ts +29 -27
- package/tests/fields-validate.test.ts +38 -38
- package/tests/getClientIp.test.ts +54 -0
- package/tests/integration.test.ts +69 -67
- package/tests/jwt.test.ts +27 -26
- package/tests/logger.test.ts +267 -34
- package/tests/rateLimit-hook.test.ts +477 -0
- package/tests/redisHelper.test.ts +187 -188
- package/tests/redisKeys.test.ts +6 -73
- package/tests/scanConfig.test.ts +144 -0
- package/tests/sqlBuilder-advanced.test.ts +217 -215
- package/tests/sqlBuilder.test.ts +92 -91
- package/tests/sync-connection.test.ts +29 -29
- package/tests/syncDb-apply.test.ts +97 -96
- package/tests/syncDb-array-number.test.ts +160 -0
- package/tests/syncDb-constants.test.ts +48 -47
- package/tests/syncDb-ddl.test.ts +99 -98
- package/tests/syncDb-helpers.test.ts +29 -28
- package/tests/syncDb-schema.test.ts +61 -60
- package/tests/syncDb-types.test.ts +60 -59
- package/tests/syncMenu-paths.test.ts +68 -0
- package/tests/util.test.ts +42 -41
- package/tests/validator-array-number.test.ts +310 -0
- package/tests/validator-default.test.ts +373 -0
- package/tests/validator.test.ts +271 -266
- package/tsconfig.json +4 -5
- package/types/api.d.ts +7 -12
- package/types/befly.d.ts +60 -13
- package/types/cache.d.ts +8 -4
- package/types/common.d.ts +17 -9
- package/types/context.d.ts +2 -2
- package/types/crypto.d.ts +23 -0
- package/types/database.d.ts +19 -19
- package/types/hook.d.ts +2 -2
- package/types/jwt.d.ts +118 -0
- package/types/logger.d.ts +30 -0
- package/types/plugin.d.ts +4 -4
- package/types/redis.d.ts +7 -3
- package/types/roleApisCache.ts +23 -0
- package/types/sync.d.ts +10 -10
- package/types/table.d.ts +50 -9
- package/types/validate.d.ts +69 -0
- package/utils/addonHelper.ts +90 -0
- package/utils/arrayKeysToCamel.ts +18 -0
- package/utils/calcPerfTime.ts +13 -0
- package/utils/configTypes.ts +3 -0
- package/utils/cors.ts +19 -0
- package/utils/fieldClear.ts +75 -0
- package/utils/genShortId.ts +12 -0
- package/utils/getClientIp.ts +45 -0
- package/utils/keysToCamel.ts +22 -0
- package/utils/keysToSnake.ts +22 -0
- package/utils/modules.ts +98 -0
- package/utils/pickFields.ts +19 -0
- package/utils/process.ts +56 -0
- package/utils/regex.ts +225 -0
- package/utils/response.ts +115 -0
- package/utils/route.ts +23 -0
- package/utils/scanConfig.ts +142 -0
- package/utils/scanFiles.ts +48 -0
- package/.prettierignore +0 -2
- package/.prettierrc +0 -12
- package/docs/1-/345/237/272/346/234/254/344/273/213/347/273/215.md +0 -35
- package/docs/2-/345/210/235/346/255/245/344/275/223/351/252/214.md +0 -64
- package/docs/3-/347/254/254/344/270/200/344/270/252/346/216/245/345/217/243.md +0 -46
- package/docs/4-/346/223/215/344/275/234/346/225/260/346/215/256/345/272/223.md +0 -172
- package/hooks/requestLogger.ts +0 -84
- package/types/index.ts +0 -24
- package/util.ts +0 -283
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
# Quickstart 快速入门
|
|
2
|
+
|
|
3
|
+
> 5 分钟搭建你的第一个 Befly API 服务
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
- [环境准备](#环境准备)
|
|
8
|
+
- [项目结构](#项目结构)
|
|
9
|
+
- [第一个 API](#第一个-api)
|
|
10
|
+
- [配置数据库](#配置数据库)
|
|
11
|
+
- [定义表结构](#定义表结构)
|
|
12
|
+
- [同步数据库](#同步数据库)
|
|
13
|
+
- [启动服务](#启动服务)
|
|
14
|
+
- [下一步](#下一步)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 环境准备
|
|
19
|
+
|
|
20
|
+
### 必需软件
|
|
21
|
+
|
|
22
|
+
| 软件 | 版本要求 | 说明 |
|
|
23
|
+
| ----- | -------- | ----------------- |
|
|
24
|
+
| Bun | >= 1.0 | JavaScript 运行时 |
|
|
25
|
+
| MySQL | >= 8.0 | 数据库 |
|
|
26
|
+
| Redis | >= 6.0 | 缓存(可选) |
|
|
27
|
+
|
|
28
|
+
### 安装 Bun
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
# Windows (PowerShell)
|
|
32
|
+
powershell -c "irm bun.sh/install.ps1 | iex"
|
|
33
|
+
|
|
34
|
+
# macOS / Linux
|
|
35
|
+
curl -fsSL https://bun.sh/install | bash
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### 创建项目
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# 克隆模板项目
|
|
42
|
+
git clone https://github.com/chenbimo/befly-tpl.git my-api
|
|
43
|
+
cd my-api
|
|
44
|
+
|
|
45
|
+
# 安装依赖
|
|
46
|
+
bun install
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## 项目结构
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
my-api/
|
|
55
|
+
├── apis/ # API 接口目录
|
|
56
|
+
│ └── user/
|
|
57
|
+
│ └── login.ts # 用户登录接口
|
|
58
|
+
├── tables/ # 表定义目录
|
|
59
|
+
│ └── user.json # 用户表定义
|
|
60
|
+
├── configs/ # 配置文件目录
|
|
61
|
+
│ ├── befly.common.json # 公共配置
|
|
62
|
+
│ ├── befly.development.json # 开发环境配置
|
|
63
|
+
│ └── befly.production.json # 生产环境配置
|
|
64
|
+
├── main.ts # 入口文件
|
|
65
|
+
└── package.json
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 第一个 API
|
|
71
|
+
|
|
72
|
+
### 创建 API 文件
|
|
73
|
+
|
|
74
|
+
在 `apis/user/` 目录下创建 `login.ts`:
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
import type { ApiRoute } from "befly/types/api";
|
|
78
|
+
|
|
79
|
+
export default {
|
|
80
|
+
name: "用户登录",
|
|
81
|
+
method: "POST",
|
|
82
|
+
auth: false, // 不需要登录
|
|
83
|
+
fields: {
|
|
84
|
+
email: { name: "邮箱", type: "string", min: 5, max: 100, regexp: "@email" },
|
|
85
|
+
password: { name: "密码", type: "string", min: 6, max: 100 }
|
|
86
|
+
},
|
|
87
|
+
required: ["email", "password"],
|
|
88
|
+
handler: async (befly, ctx) => {
|
|
89
|
+
// 查询用户
|
|
90
|
+
const user = await befly.db.getDetail({
|
|
91
|
+
table: "user",
|
|
92
|
+
columns: ["id", "email", "password", "nickname"],
|
|
93
|
+
where: { email: ctx.body.email }
|
|
94
|
+
});
|
|
95
|
+
|
|
96
|
+
if (!user?.id) {
|
|
97
|
+
return No("用户不存在");
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// 验证密码
|
|
101
|
+
const isValid = await befly.cipher.verifyPassword(ctx.body.password, user.password);
|
|
102
|
+
if (!isValid) {
|
|
103
|
+
return No("密码错误");
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// 签发令牌
|
|
107
|
+
const token = befly.jwt.sign({ userId: user.id });
|
|
108
|
+
|
|
109
|
+
return Yes("登录成功", { token: token, user: { id: user.id, nickname: user.nickname } });
|
|
110
|
+
}
|
|
111
|
+
} as ApiRoute;
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
### API 路由规则
|
|
115
|
+
|
|
116
|
+
文件路径自动转换为路由:
|
|
117
|
+
|
|
118
|
+
| 文件路径 | 路由路径 |
|
|
119
|
+
| ----------------------- | ------------------------- |
|
|
120
|
+
| `apis/user/login.ts` | `POST /api/user/login` |
|
|
121
|
+
| `apis/user/register.ts` | `POST /api/user/register` |
|
|
122
|
+
| `apis/article/list.ts` | `POST /api/article/list` |
|
|
123
|
+
|
|
124
|
+
---
|
|
125
|
+
|
|
126
|
+
## 配置数据库
|
|
127
|
+
|
|
128
|
+
### 编辑配置文件
|
|
129
|
+
|
|
130
|
+
修改 `configs/befly.development.json`:
|
|
131
|
+
|
|
132
|
+
```json
|
|
133
|
+
{
|
|
134
|
+
"db": {
|
|
135
|
+
"type": "mysql",
|
|
136
|
+
"host": "127.0.0.1",
|
|
137
|
+
"port": 3306,
|
|
138
|
+
"user": "root",
|
|
139
|
+
"password": "your_password",
|
|
140
|
+
"database": "my_api"
|
|
141
|
+
},
|
|
142
|
+
"redis": {
|
|
143
|
+
"host": "127.0.0.1",
|
|
144
|
+
"port": 6379,
|
|
145
|
+
"password": ""
|
|
146
|
+
},
|
|
147
|
+
"auth": {
|
|
148
|
+
"secret": "your-jwt-secret-change-in-production",
|
|
149
|
+
"expiresIn": "7d"
|
|
150
|
+
},
|
|
151
|
+
"logger": {
|
|
152
|
+
"debug": 1,
|
|
153
|
+
"console": 1
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### 创建数据库
|
|
159
|
+
|
|
160
|
+
```sql
|
|
161
|
+
CREATE DATABASE my_api CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 定义表结构
|
|
167
|
+
|
|
168
|
+
### 创建表定义文件
|
|
169
|
+
|
|
170
|
+
在 `tables/` 目录下创建 `user.json`:
|
|
171
|
+
|
|
172
|
+
```json
|
|
173
|
+
{
|
|
174
|
+
"email": "邮箱|string|5|100||true|^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,}$",
|
|
175
|
+
"password": "密码|string|6|100||true",
|
|
176
|
+
"nickname": "昵称|string|2|50|用户",
|
|
177
|
+
"avatar": "头像|string|0|500",
|
|
178
|
+
"phone": "手机号|string|0|20"
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### 字段定义格式
|
|
183
|
+
|
|
184
|
+
格式:`"字段标签|类型|最小|最大|默认|必填|正则"`
|
|
185
|
+
|
|
186
|
+
| 位置 | 说明 | 示例 |
|
|
187
|
+
| ---- | ----------- | --------------------- |
|
|
188
|
+
| 1 | 字段标签 | `邮箱` |
|
|
189
|
+
| 2 | 数据类型 | `string` / `number` |
|
|
190
|
+
| 3 | 最小值/长度 | `5` |
|
|
191
|
+
| 4 | 最大值/长度 | `100` |
|
|
192
|
+
| 5 | 默认值 | `用户` |
|
|
193
|
+
| 6 | 是否必填 | `true` / `false` |
|
|
194
|
+
| 7 | 正则验证 | `@email` 或自定义正则 |
|
|
195
|
+
|
|
196
|
+
### 自动字段
|
|
197
|
+
|
|
198
|
+
每个表自动添加:
|
|
199
|
+
|
|
200
|
+
| 字段 | 类型 | 说明 |
|
|
201
|
+
| ------------ | ------- | ------------------------------- |
|
|
202
|
+
| `id` | BIGINT | 主键,自增 |
|
|
203
|
+
| `created_at` | BIGINT | 创建时间戳 |
|
|
204
|
+
| `updated_at` | BIGINT | 更新时间戳 |
|
|
205
|
+
| `state` | TINYINT | 状态(1=正常,0=禁用,-1=删除) |
|
|
206
|
+
|
|
207
|
+
---
|
|
208
|
+
|
|
209
|
+
## 同步数据库
|
|
210
|
+
|
|
211
|
+
### 运行同步命令
|
|
212
|
+
|
|
213
|
+
```bash
|
|
214
|
+
# 全量同步(表结构 + API + 菜单 + 开发账户)
|
|
215
|
+
bun befly sync
|
|
216
|
+
|
|
217
|
+
# 或单独同步
|
|
218
|
+
bun befly sync:db # 只同步表结构
|
|
219
|
+
bun befly sync:api # 只同步 API 路由
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### 验证同步结果
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# 查看数据库
|
|
226
|
+
mysql -u root -p my_api -e "SHOW TABLES;"
|
|
227
|
+
|
|
228
|
+
# 应该看到:
|
|
229
|
+
# +------------------+
|
|
230
|
+
# | Tables_in_my_api |
|
|
231
|
+
# +------------------+
|
|
232
|
+
# | user |
|
|
233
|
+
# +------------------+
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## 启动服务
|
|
239
|
+
|
|
240
|
+
### 开发模式
|
|
241
|
+
|
|
242
|
+
```bash
|
|
243
|
+
bun run dev
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
服务启动后:
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
🚀 Befly 服务已启动
|
|
250
|
+
📍 http://localhost:3000
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### 测试 API
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# 测试登录接口
|
|
257
|
+
curl -X POST http://localhost:3000/api/user/login \
|
|
258
|
+
-H "Content-Type: application/json" \
|
|
259
|
+
-d '{"email":"test@example.com","password":"123456"}'
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
响应示例:
|
|
263
|
+
|
|
264
|
+
```json
|
|
265
|
+
{
|
|
266
|
+
"code": 0,
|
|
267
|
+
"msg": "登录成功",
|
|
268
|
+
"data": {
|
|
269
|
+
"token": "eyJhbGciOiJIUzI1NiIs...",
|
|
270
|
+
"user": {
|
|
271
|
+
"id": 1,
|
|
272
|
+
"nickname": "用户"
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
---
|
|
279
|
+
|
|
280
|
+
## 下一步
|
|
281
|
+
|
|
282
|
+
### 学习更多
|
|
283
|
+
|
|
284
|
+
| 主题 | 文档 | 说明 |
|
|
285
|
+
| ---------- | ----------------------------------------- | -------------------- |
|
|
286
|
+
| API 开发 | [api.md](../api/api.md) | API 定义、字段、权限 |
|
|
287
|
+
| 表结构 | [table.md](../reference/table.md) | 表定义格式详解 |
|
|
288
|
+
| 数据库操作 | [database.md](../plugins/database.md) | CRUD 操作 |
|
|
289
|
+
| 配置系统 | [config.md](../reference/config.md) | 配置文件说明 |
|
|
290
|
+
| 插件开发 | [plugin.md](../plugins/plugin.md) | 自定义插件 |
|
|
291
|
+
| Hook 开发 | [hook.md](../hooks/hook.md) | 请求处理钩子 |
|
|
292
|
+
| 验证系统 | [validator.md](../reference/validator.md) | 参数验证 |
|
|
293
|
+
| 日志系统 | [logger.md](../reference/logger.md) | 日志配置 |
|
|
294
|
+
| 加密工具 | [cipher.md](../plugins/cipher.md) | 加密与 JWT |
|
|
295
|
+
| 同步命令 | [sync.md](../reference/sync.md) | 数据库同步 |
|
|
296
|
+
|
|
297
|
+
### 常用命令
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
# 开发
|
|
301
|
+
bun run dev # 启动开发服务
|
|
302
|
+
bun befly sync # 同步数据库
|
|
303
|
+
bun befly sync:db # 只同步表结构
|
|
304
|
+
|
|
305
|
+
# 生产
|
|
306
|
+
bun run build # 构建
|
|
307
|
+
bun run start # 启动生产服务
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### 项目示例
|
|
311
|
+
|
|
312
|
+
```
|
|
313
|
+
apis/
|
|
314
|
+
├── user/
|
|
315
|
+
│ ├── login.ts # 登录
|
|
316
|
+
│ ├── register.ts # 注册
|
|
317
|
+
│ ├── info.ts # 获取信息
|
|
318
|
+
│ └── update.ts # 更新信息
|
|
319
|
+
├── article/
|
|
320
|
+
│ ├── list.ts # 文章列表
|
|
321
|
+
│ ├── detail.ts # 文章详情
|
|
322
|
+
│ ├── create.ts # 创建文章
|
|
323
|
+
│ └── delete.ts # 删除文章
|
|
324
|
+
└── common/
|
|
325
|
+
└── upload.ts # 文件上传
|
|
326
|
+
|
|
327
|
+
tables/
|
|
328
|
+
├── user.json # 用户表
|
|
329
|
+
├── article.json # 文章表
|
|
330
|
+
└── category.json # 分类表
|
|
331
|
+
```
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# auth Hook - 身份认证
|
|
2
|
+
|
|
3
|
+
> 解析/校验 JWT Token,并将用户信息写入 `ctx.user`。
|
|
4
|
+
|
|
5
|
+
## 作用
|
|
6
|
+
|
|
7
|
+
- 从请求头中解析鉴权信息(常见为 `Authorization` 或 `token`)
|
|
8
|
+
- 校验 token 合法性与过期
|
|
9
|
+
- 将 token payload 写入 `ctx.user`,供后续 `permission` / 业务 handler 使用
|
|
10
|
+
|
|
11
|
+
## 何时生效
|
|
12
|
+
|
|
13
|
+
- API 请求进入 hook pipeline 时执行
|
|
14
|
+
- 如果某个 API 路由显式声明 `auth: false`,则该接口跳过登录态要求(但 hook 仍可能解析 token,以便后续使用)
|
|
15
|
+
|
|
16
|
+
## 配置
|
|
17
|
+
|
|
18
|
+
JWT 的核心配置来自 `beflyConfig.auth`:
|
|
19
|
+
|
|
20
|
+
```json
|
|
21
|
+
{
|
|
22
|
+
"auth": {
|
|
23
|
+
"secret": "your-jwt-secret-change-in-production",
|
|
24
|
+
"expiresIn": "7d",
|
|
25
|
+
"algorithm": "HS256"
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## 行为要点
|
|
31
|
+
|
|
32
|
+
- token 无效/过期时:通常不会在这里直接判权限,而是由后续 `permission` 按接口是否需要登录来决定是否拦截
|
|
33
|
+
- hook 写入:`ctx.user`(后续统一依赖这个字段)
|
|
34
|
+
|
|
35
|
+
## 常见问题
|
|
36
|
+
|
|
37
|
+
- Q: 为什么我 `auth:false` 的接口也能拿到 `ctx.user`?
|
|
38
|
+
- A: 接口不要求登录 ≠ 不解析 token;只要你带了 token,框架仍可解析出来给你用。
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# cors Hook - 跨域处理
|
|
2
|
+
|
|
3
|
+
> 统一设置 CORS 响应头,并处理 `OPTIONS` 预检请求。
|
|
4
|
+
|
|
5
|
+
## 作用
|
|
6
|
+
|
|
7
|
+
- 根据配置生成并写入 `ctx.corsHeaders`
|
|
8
|
+
- 对 `OPTIONS` 预检请求直接返回 204,避免进入后续 hook / handler
|
|
9
|
+
|
|
10
|
+
## 配置
|
|
11
|
+
|
|
12
|
+
```json
|
|
13
|
+
{
|
|
14
|
+
"cors": {
|
|
15
|
+
"origin": "*",
|
|
16
|
+
"methods": "GET, POST, PUT, DELETE, OPTIONS",
|
|
17
|
+
"allowedHeaders": "Content-Type, Authorization, authorization, token",
|
|
18
|
+
"exposedHeaders": "Content-Range, X-Content-Range, Authorization, authorization, token",
|
|
19
|
+
"maxAge": 86400,
|
|
20
|
+
"credentials": "true"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## 行为要点
|
|
26
|
+
|
|
27
|
+
- `OPTIONS`:不计入业务逻辑,不进入后续处理链
|
|
28
|
+
- 正常请求:仅设置 CORS 相关头,不改变业务响应体
|