zenweb 6.4.0 → 6.6.0
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 +119 -82
- package/TEMPLATE.md +231 -0
- package/package.json +12 -12
- package/AGENTS.md +0 -276
package/README.md
CHANGED
|
@@ -1,135 +1,172 @@
|
|
|
1
1
|
# ZenWeb
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
基于 Koa 的模块化轻量级 Web 框架。
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 特性
|
|
6
|
+
|
|
7
|
+
- **开箱即用** - `create()` 整合多个模块,无需逐个安装
|
|
8
|
+
- **全局 Helper** - `$body/$query/$param/$log` 在请求期间任意位置可用
|
|
9
|
+
- **装饰器驱动** - TypeScript 装饰器实现控制器路由和依赖注入
|
|
10
|
+
- **统一响应** - `fail()` 处理业务错误,控制器 return 自动输出
|
|
11
|
+
|
|
12
|
+
## 文档
|
|
6
13
|
|
|
7
14
|
[ZenWeb 文档](https://zenweb.node.ltd)
|
|
8
15
|
|
|
9
|
-
|
|
16
|
+
- 创建新项目 → 阅读 `TEMPLATE.md`
|
|
17
|
+
|
|
18
|
+
## 安装
|
|
10
19
|
|
|
11
20
|
```bash
|
|
12
|
-
# for production
|
|
13
21
|
npm i zenweb
|
|
14
22
|
|
|
15
|
-
#
|
|
23
|
+
# 开发依赖
|
|
16
24
|
npm i -D dotenv typescript rimraf tsc-watch
|
|
17
25
|
```
|
|
18
26
|
|
|
19
|
-
##
|
|
20
|
-
|
|
21
|
-
edit `package.json` file at `scripts`:
|
|
22
|
-
|
|
23
|
-
```json
|
|
24
|
-
"scripts": {
|
|
25
|
-
"start": "node --enable-source-maps app",
|
|
26
|
-
"dev": "rimraf app && tsc-watch --onSuccess \"npm run dev-start\"",
|
|
27
|
-
"dev-start": "node -r dotenv/config --enable-source-maps app",
|
|
28
|
-
"build": "rimraf app && tsc"
|
|
29
|
-
}
|
|
30
|
-
```
|
|
27
|
+
## TypeScript 配置(必需)
|
|
31
28
|
|
|
32
|
-
|
|
29
|
+
装饰器功能需要以下配置:
|
|
33
30
|
|
|
34
31
|
```json
|
|
35
32
|
{
|
|
36
|
-
{
|
|
37
33
|
"compilerOptions": {
|
|
38
34
|
"experimentalDecorators": true,
|
|
39
35
|
"emitDecoratorMetadata": true,
|
|
40
36
|
"target": "ES2020",
|
|
41
|
-
"module": "commonjs"
|
|
42
|
-
|
|
43
|
-
"esModuleInterop": true,
|
|
44
|
-
"strict": true,
|
|
45
|
-
"sourceMap": true,
|
|
46
|
-
"newLine": "lf",
|
|
47
|
-
"rootDir": "src",
|
|
48
|
-
"outDir": "app"
|
|
49
|
-
},
|
|
50
|
-
"include": ["src/**/*"]
|
|
37
|
+
"module": "commonjs"
|
|
38
|
+
}
|
|
51
39
|
}
|
|
52
40
|
```
|
|
53
41
|
|
|
54
|
-
|
|
42
|
+
## 快速开始
|
|
55
43
|
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
44
|
+
```ts
|
|
45
|
+
import { create } from 'zenweb';
|
|
46
|
+
|
|
47
|
+
create({
|
|
48
|
+
controller: {
|
|
49
|
+
discoverPaths: ['./controller'],
|
|
50
|
+
autoControllerPrefix: true,
|
|
51
|
+
},
|
|
52
|
+
}).start();
|
|
60
53
|
```
|
|
61
54
|
|
|
62
|
-
|
|
55
|
+
## 控制器
|
|
56
|
+
|
|
57
|
+
文件名映射为路由前缀(开启 `autoControllerPrefix`):
|
|
63
58
|
|
|
64
59
|
```ts
|
|
65
|
-
|
|
66
|
-
|
|
60
|
+
// controller/user.ts → /user
|
|
61
|
+
import { Get, Post, Context } from 'zenweb';
|
|
62
|
+
import { UserService } from '../service/user';
|
|
63
|
+
|
|
64
|
+
export class UserController {
|
|
65
|
+
constructor(private ctx: Context) {}
|
|
66
|
+
|
|
67
|
+
@Get() // GET /user
|
|
68
|
+
list() { return []; }
|
|
69
|
+
|
|
70
|
+
@Get('/:id') // GET /user/:id
|
|
71
|
+
detail() {
|
|
72
|
+
const { id } = this.ctx.params;
|
|
73
|
+
return { id };
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@Post() // POST /user
|
|
77
|
+
create(service: UserService) {
|
|
78
|
+
return service.create();
|
|
79
|
+
}
|
|
80
|
+
}
|
|
67
81
|
```
|
|
68
82
|
|
|
69
|
-
|
|
83
|
+
## Service
|
|
84
|
+
|
|
85
|
+
Service 类添加 `@Injectable` 注解,作用域为请求级:
|
|
70
86
|
|
|
71
87
|
```ts
|
|
88
|
+
// service/user.ts
|
|
72
89
|
import { Injectable, Context } from 'zenweb';
|
|
73
90
|
|
|
74
91
|
@Injectable
|
|
75
|
-
export class
|
|
76
|
-
constructor(
|
|
77
|
-
private ctx: Context,
|
|
78
|
-
){}
|
|
92
|
+
export class UserService {
|
|
93
|
+
constructor(private ctx: Context) {}
|
|
79
94
|
|
|
80
|
-
|
|
81
|
-
return this.ctx.ip;
|
|
95
|
+
create() {
|
|
96
|
+
return { ip: this.ctx.ip };
|
|
82
97
|
}
|
|
83
98
|
}
|
|
84
99
|
```
|
|
85
100
|
|
|
86
|
-
|
|
101
|
+
## 全局 Helper
|
|
102
|
+
|
|
103
|
+
请求期间无需注入,直接使用:
|
|
87
104
|
|
|
88
105
|
```ts
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
106
|
+
// Body 解析
|
|
107
|
+
await $body.get({ name: '!string', age: 'int' });
|
|
108
|
+
|
|
109
|
+
// Query 参数
|
|
110
|
+
await $query.get({ id: '!int', keyword: 'trim' });
|
|
111
|
+
|
|
112
|
+
// 路由参数
|
|
113
|
+
const { id } = $ctx.params;
|
|
114
|
+
|
|
115
|
+
// 日志
|
|
116
|
+
$log.info('message');
|
|
99
117
|
```
|
|
100
118
|
|
|
101
|
-
|
|
119
|
+
## 错误处理
|
|
102
120
|
|
|
103
|
-
|
|
104
|
-
|
|
121
|
+
`fail()` 用于预期业务错误:
|
|
122
|
+
|
|
123
|
+
```ts
|
|
124
|
+
import { fail } from 'zenweb';
|
|
125
|
+
|
|
126
|
+
if (!user) {
|
|
127
|
+
fail('用户不存在'); // 返回错误响应,终止执行
|
|
128
|
+
}
|
|
105
129
|
```
|
|
106
130
|
|
|
131
|
+
非预期错误(代码 bug、数据库连接失败等)直接抛出 Error,框架返回 500。
|
|
132
|
+
|
|
107
133
|
## 集成模块
|
|
108
|
-
- [core](https://www.npmjs.com/package/@zenweb/core) 核心
|
|
109
|
-
- [meta](https://www.npmjs.com/package/@zenweb/meta) 运行基本信息,例如:请求耗时
|
|
110
|
-
- [inject](https://www.npmjs.com/package/@zenweb/inject) 注入支持
|
|
111
|
-
- [router](https://www.npmjs.com/package/@zenweb/router) 路由支持
|
|
112
|
-
- [log](https://www.npmjs.com/package/@zenweb/log) 日志支持
|
|
113
|
-
- [result](https://www.npmjs.com/package/@zenweb/result) 统一结果返回,成功或失败
|
|
114
|
-
- [messagecode](https://www.npmjs.com/package/@zenweb/messagecode) 统一错误消息格式化
|
|
115
|
-
- [controller](https://www.npmjs.com/package/@zenweb/controller) 类控制器支持
|
|
116
|
-
- [helper](https://www.npmjs.com/package/@zenweb/helper) 输入数据验证助手
|
|
117
|
-
- [body](https://www.npmjs.com/package/@zenweb/body) 请求主体解析,JSON、Form
|
|
118
134
|
|
|
119
|
-
|
|
135
|
+
已集成,无需单独安装:
|
|
120
136
|
|
|
137
|
+
| 模块 | 作用 |
|
|
138
|
+
|------|------|
|
|
139
|
+
| `@zenweb/core` | 核心应用 |
|
|
140
|
+
| `@zenweb/inject` | 依赖注入 |
|
|
141
|
+
| `@zenweb/router` | Trie 路由 |
|
|
142
|
+
| `@zenweb/controller` | 控制器装饰器 |
|
|
143
|
+
| `@zenweb/body` | Body 解析 |
|
|
144
|
+
| `@zenweb/helper` | 参数验证 |
|
|
145
|
+
| `@zenweb/result` | 结果处理 |
|
|
146
|
+
| `@zenweb/log` | 日志 |
|
|
147
|
+
| `@zenweb/meta` | 请求元信息 |
|
|
148
|
+
| `@zenweb/messagecode` | 错误消息格式化 |
|
|
149
|
+
|
|
150
|
+
集成模块默认开启,可通过配置项设为 `false` 关闭。
|
|
121
151
|
|
|
122
152
|
## 可选模块
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
153
|
+
|
|
154
|
+
| 模块 | 作用 |
|
|
155
|
+
|------|------|
|
|
156
|
+
| `@zenweb/cors` | 跨域支持 |
|
|
157
|
+
| `@zenweb/sentry` | Sentry 错误收集 |
|
|
158
|
+
| `@zenweb/metric` | 运行健康信息 |
|
|
159
|
+
| `@zenweb/mysql` | MySQL 数据库 |
|
|
160
|
+
| `@zenweb/tenant` | 多租户数据库连接池 |
|
|
161
|
+
| `@zenweb/orm` | ORM 支持 |
|
|
162
|
+
| `@zenweb/template` | 模版渲染 |
|
|
163
|
+
| `@zenweb/schedule` | 定时任务 |
|
|
164
|
+
| `@zenweb/upload` | 文件上传 |
|
|
165
|
+
| `@zenweb/cache` | Redis 缓存支持 |
|
|
166
|
+
| `@zenweb/cache-opt` | Redis 缓存优化 |
|
|
167
|
+
| `@zenweb/msgpack` | `@zenweb/result` MessagePack 支持 |
|
|
168
|
+
| `@zenweb/ratelimit` | 请求量控制(防CC攻击) |
|
|
169
|
+
| `@zenweb/websocket` | WebSocket 支持(分布式会话共享) |
|
|
170
|
+
| `@zenweb/xml-body` | `@zenweb/body` XML 解析支持 |
|
|
171
|
+
| `@zenweb/form` | 表单构建 |
|
|
172
|
+
| `@zenweb/grid` | 数据表渲染 |
|
package/TEMPLATE.md
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# TEMPLATE.md
|
|
2
|
+
|
|
3
|
+
AI 编程脚手架模板 - 创建 ZenWeb 项目时使用此结构。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 项目结构
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
project/
|
|
11
|
+
├── src/
|
|
12
|
+
│ ├── index.ts # 应用入口
|
|
13
|
+
│ ├── controller/ # 控制器目录
|
|
14
|
+
│ │ └── index.ts # 根路由控制器
|
|
15
|
+
│ ├── service/ # 服务目录
|
|
16
|
+
│ ├── message-codes.json # 错误消息定义(可选)
|
|
17
|
+
│ └── types.ts # 类型定义(可选)
|
|
18
|
+
├── package.json
|
|
19
|
+
├── tsconfig.json
|
|
20
|
+
├── .env # 开发环境变量
|
|
21
|
+
└── .gitignore
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## package.json
|
|
27
|
+
|
|
28
|
+
```json
|
|
29
|
+
{
|
|
30
|
+
"name": "myapp",
|
|
31
|
+
"version": "1.0.0",
|
|
32
|
+
"main": "app/index.js",
|
|
33
|
+
"scripts": {
|
|
34
|
+
"build": "rimraf app && tsc",
|
|
35
|
+
"start": "node --enable-source-maps app",
|
|
36
|
+
"dev-start": "node --env-file=.env --enable-source-maps app",
|
|
37
|
+
"dev": "rimraf app && tsc-watch --onSuccess \"npm run dev-start\""
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"zenweb": "^6.5.0"
|
|
41
|
+
},
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"@types/node": "^16",
|
|
44
|
+
"rimraf": "^6",
|
|
45
|
+
"typescript": "^6",
|
|
46
|
+
"tsc-watch": "^6"
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## tsconfig.json
|
|
54
|
+
|
|
55
|
+
```json
|
|
56
|
+
{
|
|
57
|
+
"compilerOptions": {
|
|
58
|
+
"experimentalDecorators": true,
|
|
59
|
+
"emitDecoratorMetadata": true,
|
|
60
|
+
"target": "ES2020",
|
|
61
|
+
"module": "commonjs",
|
|
62
|
+
"types": ["node"],
|
|
63
|
+
"esModuleInterop": true,
|
|
64
|
+
"strict": true,
|
|
65
|
+
"sourceMap": true,
|
|
66
|
+
"rootDir": "src",
|
|
67
|
+
"outDir": "app"
|
|
68
|
+
},
|
|
69
|
+
"include": ["src/**/*"]
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## .env(开发环境)
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
APP_NAME=myapp
|
|
79
|
+
NODE_ENV=development
|
|
80
|
+
DEBUG=*
|
|
81
|
+
LOG_DIR=./logs
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## .gitignore
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
.env
|
|
90
|
+
app/
|
|
91
|
+
logs/
|
|
92
|
+
node_modules/
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
---
|
|
96
|
+
|
|
97
|
+
## src/index.ts(入口文件)
|
|
98
|
+
|
|
99
|
+
```ts
|
|
100
|
+
import { create } from 'zenweb';
|
|
101
|
+
|
|
102
|
+
create({
|
|
103
|
+
controller: {
|
|
104
|
+
discoverPaths: ['./controller'],
|
|
105
|
+
autoControllerPrefix: true,
|
|
106
|
+
},
|
|
107
|
+
}).start();
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## src/controller/index.ts(根路由)
|
|
113
|
+
|
|
114
|
+
```ts
|
|
115
|
+
export class IndexController {
|
|
116
|
+
index() {
|
|
117
|
+
return 'Hello ZenWeb!';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## src/controller/user.ts(示例控制器)
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
import { Get, Post, Context, $param, $body } from 'zenweb';
|
|
128
|
+
import { UserService } from '../service/user';
|
|
129
|
+
|
|
130
|
+
export class UserController {
|
|
131
|
+
constructor(private ctx: Context) {}
|
|
132
|
+
|
|
133
|
+
@Get()
|
|
134
|
+
list(service: UserService) {
|
|
135
|
+
return service.list();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
@Get('/:id')
|
|
139
|
+
async detail() {
|
|
140
|
+
const { id } = await $param.get({ id: '!int' });
|
|
141
|
+
return { id };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
@Post()
|
|
145
|
+
async create(service: UserService) {
|
|
146
|
+
const data = await $body.get({ name: '!string', email: 'string' });
|
|
147
|
+
return service.create(data);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## src/service/user.ts(示例服务)
|
|
155
|
+
|
|
156
|
+
```ts
|
|
157
|
+
import { Injectable, Context } from 'zenweb';
|
|
158
|
+
|
|
159
|
+
@Injectable
|
|
160
|
+
export class UserService {
|
|
161
|
+
constructor(private ctx: Context) {}
|
|
162
|
+
|
|
163
|
+
list() {
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
create(data: { name: string; email?: string }) {
|
|
168
|
+
return { ...data, ip: this.ctx.ip };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## src/message-codes.json(错误消息)
|
|
176
|
+
|
|
177
|
+
```json
|
|
178
|
+
{
|
|
179
|
+
"user.notfound": "用户不存在",
|
|
180
|
+
"user.login.fail": "登录失败: {reason}"
|
|
181
|
+
}
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## 命名规范
|
|
187
|
+
|
|
188
|
+
| 类型 | 文件名 | 导出名 |
|
|
189
|
+
|------|--------|--------|
|
|
190
|
+
| 控制器 | `{name}.ts` | `{Name}Controller` |
|
|
191
|
+
| 服务 | `{name}.ts` | `{Name}Service` |
|
|
192
|
+
| 类型定义 | `types.ts` | 自由命名 |
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 路由映射规则(autoControllerPrefix: true)
|
|
197
|
+
|
|
198
|
+
| 文件路径 | 路由前缀 |
|
|
199
|
+
|----------|----------|
|
|
200
|
+
| `controller/index.ts` | `/` |
|
|
201
|
+
| `controller/user.ts` | `/user` |
|
|
202
|
+
| `controller/admin/index.ts` | `/admin` |
|
|
203
|
+
| `controller/admin/user.ts` | `/admin/user` |
|
|
204
|
+
|
|
205
|
+
---
|
|
206
|
+
|
|
207
|
+
## 可选模块扩展
|
|
208
|
+
|
|
209
|
+
询问用户是否需要以下可选模块,如需要则安装并阅读对应模块的 AGENTS.md 文档进行配置:
|
|
210
|
+
|
|
211
|
+
| 模块 | 作用 |
|
|
212
|
+
|------|------|
|
|
213
|
+
| `@zenweb/cors` | 跨域支持 |
|
|
214
|
+
| `@zenweb/sentry` | Sentry 错误收集 |
|
|
215
|
+
| `@zenweb/metric` | 运行健康信息 |
|
|
216
|
+
| `@zenweb/mysql` | MySQL 数据库 |
|
|
217
|
+
| `@zenweb/tenant` | 多租户数据库连接池 |
|
|
218
|
+
| `@zenweb/orm` | ORM 支持 |
|
|
219
|
+
| `@zenweb/template` | 模版渲染 |
|
|
220
|
+
| `@zenweb/schedule` | 定时任务 |
|
|
221
|
+
| `@zenweb/upload` | 文件上传 |
|
|
222
|
+
| `@zenweb/cache` | Redis 缓存支持 |
|
|
223
|
+
| `@zenweb/cache-opt` | Redis 缓存优化 |
|
|
224
|
+
| `@zenweb/msgpack` | MessagePack 输出 |
|
|
225
|
+
| `@zenweb/ratelimit` | 请求量控制(防CC攻击) |
|
|
226
|
+
| `@zenweb/websocket` | WebSocket 支持 |
|
|
227
|
+
| `@zenweb/xml-body` | XML Body 解析 |
|
|
228
|
+
| `@zenweb/form` | 表单构建 |
|
|
229
|
+
| `@zenweb/grid` | 数据表渲染 |
|
|
230
|
+
|
|
231
|
+
**配置指引:** 安装后阅读 `node_modules/{模块名}/README.md` 获取详细配置说明。
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "zenweb",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.6.0",
|
|
4
4
|
"description": "Modular lightweight web framework based on Koa",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"typings": "./dist/index.d.ts",
|
|
7
7
|
"files": [
|
|
8
|
-
"
|
|
8
|
+
"TEMPLATE.md",
|
|
9
9
|
"dist"
|
|
10
10
|
],
|
|
11
11
|
"scripts": {
|
|
@@ -28,16 +28,16 @@
|
|
|
28
28
|
"license": "MIT",
|
|
29
29
|
"homepage": "https://zenweb.node.ltd",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@zenweb/body": "^5.
|
|
32
|
-
"@zenweb/controller": "^6.
|
|
33
|
-
"@zenweb/core": "^5.
|
|
34
|
-
"@zenweb/helper": "^5.
|
|
35
|
-
"@zenweb/inject": "^5.
|
|
36
|
-
"@zenweb/log": "^5.
|
|
37
|
-
"@zenweb/messagecode": "^5.
|
|
38
|
-
"@zenweb/meta": "^5.
|
|
39
|
-
"@zenweb/result": "^5.
|
|
40
|
-
"@zenweb/router": "^6.
|
|
31
|
+
"@zenweb/body": "^5.5.0",
|
|
32
|
+
"@zenweb/controller": "^6.6.1",
|
|
33
|
+
"@zenweb/core": "^5.5.0",
|
|
34
|
+
"@zenweb/helper": "^5.6.0",
|
|
35
|
+
"@zenweb/inject": "^5.5.0",
|
|
36
|
+
"@zenweb/log": "^5.4.0",
|
|
37
|
+
"@zenweb/messagecode": "^5.6.0",
|
|
38
|
+
"@zenweb/meta": "^5.3.0",
|
|
39
|
+
"@zenweb/result": "^5.5.0",
|
|
40
|
+
"@zenweb/router": "^6.6.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/node": "^16.18.126",
|
package/AGENTS.md
DELETED
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
# AGENTS.md
|
|
2
|
-
|
|
3
|
-
AI 专用 API 参考文档,随 npm 包发布,供 AI 编程助手使用。
|
|
4
|
-
|
|
5
|
-
## 模块概述
|
|
6
|
-
|
|
7
|
-
ZenWeb 是基于 Koa 的模块化轻量级 Web 框架。`create()` 函数整合了多个常用模块,简化新项目配置,无需单独安装已集成模块。各模块详细用法请参阅其各自的 AGENTS.md 文件。
|
|
8
|
-
|
|
9
|
-
## 导出
|
|
10
|
-
|
|
11
|
-
```ts
|
|
12
|
-
// 主函数
|
|
13
|
-
export { create, Core, CreateOptions };
|
|
14
|
-
|
|
15
|
-
// 依赖注入
|
|
16
|
-
export { Init, Inject, Injectable, $getInstance } from '@zenweb/inject';
|
|
17
|
-
|
|
18
|
-
// 路由
|
|
19
|
-
export { Router, RouterMethod, RouterPath } from '@zenweb/router';
|
|
20
|
-
|
|
21
|
-
// 结果处理
|
|
22
|
-
export { ResultFail, fail } from '@zenweb/result';
|
|
23
|
-
|
|
24
|
-
// 控制器装饰器
|
|
25
|
-
export {
|
|
26
|
-
Controller,
|
|
27
|
-
Mapping,
|
|
28
|
-
Get,
|
|
29
|
-
Post,
|
|
30
|
-
Put,
|
|
31
|
-
Patch,
|
|
32
|
-
Delete,
|
|
33
|
-
All,
|
|
34
|
-
} from '@zenweb/controller';
|
|
35
|
-
|
|
36
|
-
// Core 相关
|
|
37
|
-
export {
|
|
38
|
-
Next,
|
|
39
|
-
SetupFunction,
|
|
40
|
-
Context,
|
|
41
|
-
Middleware,
|
|
42
|
-
SetupHelper,
|
|
43
|
-
$getCore,
|
|
44
|
-
$getContext,
|
|
45
|
-
$core,
|
|
46
|
-
$ctx,
|
|
47
|
-
$debug,
|
|
48
|
-
createDebug,
|
|
49
|
-
} from '@zenweb/core';
|
|
50
|
-
|
|
51
|
-
// Body 解析
|
|
52
|
-
export {
|
|
53
|
-
Body,
|
|
54
|
-
ObjectBody,
|
|
55
|
-
BodyHelper,
|
|
56
|
-
RawBody,
|
|
57
|
-
TextBody,
|
|
58
|
-
useBodyParser,
|
|
59
|
-
$body,
|
|
60
|
-
$getTextBody,
|
|
61
|
-
$getRawBody,
|
|
62
|
-
$getObjectBody,
|
|
63
|
-
} from '@zenweb/body';
|
|
64
|
-
|
|
65
|
-
// Helper
|
|
66
|
-
export {
|
|
67
|
-
QueryHelper,
|
|
68
|
-
TypeCastHelper,
|
|
69
|
-
ParamHelper,
|
|
70
|
-
$param,
|
|
71
|
-
$query,
|
|
72
|
-
$helperBase,
|
|
73
|
-
} from '@zenweb/helper';
|
|
74
|
-
|
|
75
|
-
// Log
|
|
76
|
-
export {
|
|
77
|
-
$log,
|
|
78
|
-
$getLogger,
|
|
79
|
-
Logger,
|
|
80
|
-
} from '@zenweb/log';
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
## create(options?: CreateOptions)
|
|
84
|
-
|
|
85
|
-
创建应用实例,自动安装集成模块。
|
|
86
|
-
|
|
87
|
-
```ts
|
|
88
|
-
import { create } from 'zenweb';
|
|
89
|
-
|
|
90
|
-
create({
|
|
91
|
-
// 全局实例,默认 true
|
|
92
|
-
global: true,
|
|
93
|
-
|
|
94
|
-
// 模块配置,设为 false 可禁用
|
|
95
|
-
core: { env: 'production', keys: ['secret'] },
|
|
96
|
-
meta: { showVersion: true, traceId: true },
|
|
97
|
-
inject: false, // 禁用注入
|
|
98
|
-
log: { dir: '/var/log/app' },
|
|
99
|
-
router: false, // 禁用路由
|
|
100
|
-
messagecode: { codes: { 'error': '错误' } },
|
|
101
|
-
body: { limit: 1024 * 1024 },
|
|
102
|
-
result: { failCode: 1, failStatus: 200 },
|
|
103
|
-
helper: { page: { defaultLimit: 20 } },
|
|
104
|
-
controller: { discoverPaths: ['./controller'], autoControllerPrefix: true },
|
|
105
|
-
})
|
|
106
|
-
.start();
|
|
107
|
-
```
|
|
108
|
-
|
|
109
|
-
## CreateOptions 类型
|
|
110
|
-
|
|
111
|
-
```ts
|
|
112
|
-
interface CreateOptions {
|
|
113
|
-
global?: boolean; // 全局实例,默认 true
|
|
114
|
-
core?: CoreOption; // @zenweb/core 配置
|
|
115
|
-
inject?: false; // 禁用 @zenweb/inject
|
|
116
|
-
meta?: MetaOption | false; // @zenweb/meta 配置或禁用
|
|
117
|
-
log?: LogOption | false; // @zenweb/log 配置或禁用
|
|
118
|
-
router?: false; // 禁用 @zenweb/router
|
|
119
|
-
messagecode?: MessageCodeOption | false;
|
|
120
|
-
body?: BodyOption | false;
|
|
121
|
-
result?: ResultOption | false;
|
|
122
|
-
helper?: HelperOption | false;
|
|
123
|
-
controller?: ControllerSetupOption | false;
|
|
124
|
-
}
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## 集成模块列表
|
|
128
|
-
|
|
129
|
-
以下模块已集成,无需单独安装。详细 API 请参阅各模块 AGENTS.md:
|
|
130
|
-
|
|
131
|
-
| 模块 | 作用 | 默认状态 |
|
|
132
|
-
|------|------|----------|
|
|
133
|
-
| `@zenweb/core` | 核心应用和上下文管理 | 启用 |
|
|
134
|
-
| `@zenweb/meta` | 请求元信息(耗时、请求ID、追踪ID) | 启用 |
|
|
135
|
-
| `@zenweb/inject` | 依赖注入系统 | 启用 |
|
|
136
|
-
| `@zenweb/router` | Trie 高性能路由 | 启用 |
|
|
137
|
-
| `@zenweb/log` | 请求日志 | 启用 |
|
|
138
|
-
| `@zenweb/result` | 统一成功/失败响应处理 | 启用 |
|
|
139
|
-
| `@zenweb/messagecode` | 错误消息代码格式化 | 启用 |
|
|
140
|
-
| `@zenweb/controller` | 类控制器装饰器路由 | 启用 |
|
|
141
|
-
| `@zenweb/helper` | 输入验证和类型转换助手 | 启用 |
|
|
142
|
-
| `@zenweb/body` | 请求主体解析(JSON、Form) | 启用 |
|
|
143
|
-
|
|
144
|
-
## 可选扩展模块
|
|
145
|
-
|
|
146
|
-
以下模块需单独安装:
|
|
147
|
-
|
|
148
|
-
- `@zenweb/cors` - 跨域支持
|
|
149
|
-
- `@zenweb/sentry` - Sentry 错误收集
|
|
150
|
-
- `@zenweb/metric` - 生产运行健康信息
|
|
151
|
-
- `@zenweb/validation` - JSONSchema 验证
|
|
152
|
-
- `@zenweb/mysql` - MySQL 数据库
|
|
153
|
-
- `@zenweb/orm` - ORM 支持
|
|
154
|
-
- `@zenweb/template` - 模板渲染
|
|
155
|
-
- `@zenweb/schedule` - 定时任务
|
|
156
|
-
- `@zenweb/form` - 统一表单
|
|
157
|
-
- `@zenweb/grid` - 统一表格
|
|
158
|
-
- `@zenweb/upload` - 文件上传
|
|
159
|
-
- `@zenweb/xml-body` - XML Body 解析
|
|
160
|
-
- `@zenweb/msgpack` - MessagePack 输出
|
|
161
|
-
|
|
162
|
-
## 全局 Helper ($前缀)
|
|
163
|
-
|
|
164
|
-
基于 AsyncLocalStorage,请求期间可在任意位置调用:
|
|
165
|
-
|
|
166
|
-
```ts
|
|
167
|
-
// Body 解析和类型转换
|
|
168
|
-
await $body.get({ name: 'string', age: '!int' });
|
|
169
|
-
await $body.page({ limit: 10 });
|
|
170
|
-
await $getObjectBody();
|
|
171
|
-
|
|
172
|
-
// Query 和 Param
|
|
173
|
-
await $query.get({ id: '!int' });
|
|
174
|
-
await $query.page();
|
|
175
|
-
await $param.data();
|
|
176
|
-
|
|
177
|
-
// 日志
|
|
178
|
-
$log.info('message');
|
|
179
|
-
$log.child({ extra: 'field' }).debug('debug msg');
|
|
180
|
-
|
|
181
|
-
// 上下文和 Core
|
|
182
|
-
const ctx = $ctx;
|
|
183
|
-
const core = $getCore();
|
|
184
|
-
const ip = $ctx.ip;
|
|
185
|
-
```
|
|
186
|
-
|
|
187
|
-
## 依赖注入
|
|
188
|
-
|
|
189
|
-
使用 TypeScript 装饰器(需 `experimentalDecorators` 和 `emitDecoratorMetadata`):
|
|
190
|
-
|
|
191
|
-
```ts
|
|
192
|
-
@Injectable // 请求级服务(默认)
|
|
193
|
-
@Injectable('singleton') // 单例服务
|
|
194
|
-
|
|
195
|
-
class MyService {
|
|
196
|
-
constructor(private ctx: Context) {} // 自动注入 Context
|
|
197
|
-
|
|
198
|
-
@Init // 初始化方法
|
|
199
|
-
init(other: OtherService) {}
|
|
200
|
-
|
|
201
|
-
@Inject other!: OtherService; // 属性注入
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// 控制器方法参数自动注入
|
|
205
|
-
@Get()
|
|
206
|
-
handler(service: MyService) {}
|
|
207
|
-
```
|
|
208
|
-
|
|
209
|
-
## 控制器模式
|
|
210
|
-
|
|
211
|
-
```ts
|
|
212
|
-
export class UserController {
|
|
213
|
-
@Get() // GET /user (方法名作为路径)
|
|
214
|
-
index() { return 'list'; }
|
|
215
|
-
|
|
216
|
-
@Get('/:id') // GET /user/:id
|
|
217
|
-
detail() {
|
|
218
|
-
return $param.data(); // 获取路由参数
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
@Post() // POST /user
|
|
222
|
-
create() {
|
|
223
|
-
return $body.get({ name: '!string', email: 'string' });
|
|
224
|
-
}
|
|
225
|
-
|
|
226
|
-
@Put('/:id')
|
|
227
|
-
update() {}
|
|
228
|
-
|
|
229
|
-
@Delete('/:id')
|
|
230
|
-
remove() {}
|
|
231
|
-
}
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
`controller.discoverPaths` 配置控制器目录,`autoControllerPrefix: true` 自动将文件路径映射为路由前缀。
|
|
235
|
-
|
|
236
|
-
## 错误处理
|
|
237
|
-
|
|
238
|
-
```ts
|
|
239
|
-
import { fail } from 'zenweb';
|
|
240
|
-
|
|
241
|
-
// 立即终止并返回错误响应
|
|
242
|
-
fail('错误消息');
|
|
243
|
-
fail(400, '参数错误');
|
|
244
|
-
fail({ code: 123, message: '自定义错误', status: 200 });
|
|
245
|
-
|
|
246
|
-
// controller 方法 return 值自动包装为成功响应
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
## TypeScript 配置要求
|
|
250
|
-
|
|
251
|
-
```json
|
|
252
|
-
{
|
|
253
|
-
"compilerOptions": {
|
|
254
|
-
"experimentalDecorators": true,
|
|
255
|
-
"emitDecoratorMetadata": true,
|
|
256
|
-
"target": "ES2020",
|
|
257
|
-
"module": "commonjs",
|
|
258
|
-
"strict": true
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
```
|
|
262
|
-
|
|
263
|
-
## 各模块 AGENTS.md 位置
|
|
264
|
-
|
|
265
|
-
安装后可读取以下文件获取详细 API:
|
|
266
|
-
|
|
267
|
-
- `node_modules/@zenweb/core/AGENTS.md`
|
|
268
|
-
- `node_modules/@zenweb/meta/AGENTS.md`
|
|
269
|
-
- `node_modules/@zenweb/inject/AGENTS.md`
|
|
270
|
-
- `node_modules/@zenweb/router/AGENTS.md`
|
|
271
|
-
- `node_modules/@zenweb/log/AGENTS.md`
|
|
272
|
-
- `node_modules/@zenweb/result/AGENTS.md`
|
|
273
|
-
- `node_modules/@zenweb/messagecode/AGENTS.md`
|
|
274
|
-
- `node_modules/@zenweb/controller/AGENTS.md`
|
|
275
|
-
- `node_modules/@zenweb/helper/AGENTS.md`
|
|
276
|
-
- `node_modules/@zenweb/body/AGENTS.md`
|