jax-hono 1.0.19 → 1.0.21
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 +32 -32
- package/bin/jax.js +66 -66
- package/bin/jax.ts +8 -8
- package/build/build.ts +19 -19
- package/build/generate-config.ts +122 -122
- package/build/generate-registry.ts +902 -902
- package/build/generated-path.ts +20 -20
- package/config.ts +86 -83
- package/core/api-controller.ts +290 -290
- package/core/app.ts +207 -207
- package/core/controller.ts +85 -85
- package/core/generated.ts +118 -96
- package/core/hono.ts +63 -63
- package/core/service.ts +44 -44
- package/docs/agent.md +169 -167
- package/docs/jax.md +329 -327
- package/helpers/config.ts +23 -23
- package/helpers/crud.ts +27 -27
- package/helpers/index.ts +4 -4
- package/helpers/route.ts +7 -7
- package/index.ts +121 -121
- package/middleware/api-response.ts +44 -44
- package/middleware/jwt.ts +90 -90
- package/middleware/request-log.ts +3 -3
- package/package.json +129 -124
- package/plugins/config.ts +8 -8
- package/plugins/define.ts +5 -5
- package/plugins/mongoose/index.ts +57 -57
- package/plugins/mongoose/model.ts +322 -322
- package/plugins/mongoose/schema.ts +30 -30
- package/plugins/session/index.ts +86 -86
- package/setup.ts +105 -105
- package/types/config.ts +9 -9
- package/types/context.ts +9 -9
- package/types/index.ts +2 -2
- package/utils/array.ts +7 -7
- package/utils/async.ts +47 -47
- package/utils/crypto.ts +6 -6
- package/utils/http.ts +106 -0
- package/utils/index.ts +3 -2
- package/utils/regexp.ts +14 -14
- package/utils/transform.ts +3 -3
package/docs/jax.md
CHANGED
|
@@ -1,327 +1,329 @@
|
|
|
1
|
-
# Jax 框架说明
|
|
2
|
-
|
|
3
|
-
Jax 是当前项目内置且绑定 Hono 的轻量服务框架层,负责应用创建、路由注册、Controller/Service 基类、运行时上下文、统一响应、配置加载和代码生成。
|
|
4
|
-
|
|
5
|
-
业务代码建议从 `jax` 入口导入框架核心能力:
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
import { ApiController, Service, createApi, config } from 'jax';
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
工具、错误、类型等分类能力建议走子入口;统一响应类型从 `jax` 主入口导出:
|
|
12
|
-
|
|
13
|
-
```ts
|
|
14
|
-
import { md5, createToken, escapeRegex } from 'jax/utils';
|
|
15
|
-
import { JaxHttpError } from 'jax/errors';
|
|
16
|
-
import type { ApiResponse } from 'jax';
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
除非是在维护 Jax 内部代码,否则不要从 `src/jax/**` 文件路径导入。
|
|
20
|
-
|
|
21
|
-
## 目录结构
|
|
22
|
-
|
|
23
|
-
```txt
|
|
24
|
-
src/jax/
|
|
25
|
-
core/ # Hono runtime、生命周期、Controller/Service
|
|
26
|
-
middleware/ # 框架中间件
|
|
27
|
-
plugins/ # 插件定义、内置插件配置、内置插件实现
|
|
28
|
-
build/ # 代码生成/扫描注册
|
|
29
|
-
helpers/ # 框架辅助函数
|
|
30
|
-
utils/ # 更底层的纯工具
|
|
31
|
-
errors/ # 统一错误类型
|
|
32
|
-
types/ # 框架公共类型
|
|
33
|
-
.jax-hono/ # 调用项目中的自动生成注册表
|
|
34
|
-
config.ts # 配置加载入口
|
|
35
|
-
index.ts # 对业务侧暴露的统一入口
|
|
36
|
-
setup.ts # 生成配置/路由/服务/模型注册表
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
## 分层边界
|
|
40
|
-
|
|
41
|
-
### `base`
|
|
42
|
-
|
|
43
|
-
放框架基类和请求上下文访问能力。
|
|
44
|
-
|
|
45
|
-
- `Controller`:Controller 基类,提供 `this.context`、`this.ctx`、`this.state`、`this.model`、`this.service`。
|
|
46
|
-
- `ApiController`:CRUD API Controller 基类,提供 `index/show/create/update/delete` 默认实现。
|
|
47
|
-
- `Service`:Service 基类,提供 `this.config`、`this.model`、`this.service` 和请求上下文访问。
|
|
48
|
-
|
|
49
|
-
业务 Controller 和 Service 应优先继承这些基类。
|
|
50
|
-
|
|
51
|
-
### `middleware`
|
|
52
|
-
|
|
53
|
-
只放框架级中间件,例如统一响应、日志、异常兜底等。
|
|
54
|
-
|
|
55
|
-
业务鉴权、后台权限、企业状态校验等应放在 `src/utils`、`src/router` 或业务模块中。
|
|
56
|
-
|
|
57
|
-
### `plugin`
|
|
58
|
-
|
|
59
|
-
放 Jax 内置插件,例如 Mongoose 插件。
|
|
60
|
-
|
|
61
|
-
插件配置参考 Egg:`src/jax/plugins/config.ts` 声明框架内置插件,业务项目通过 `src/config/plugin.ts` 显式启用或覆盖。
|
|
62
|
-
|
|
63
|
-
插件形态参考 Fastify:插件模块可以导出函数,也可以通过 `definePlugin` 导出对象。
|
|
64
|
-
|
|
65
|
-
插件生命周期参考 Adonis/Nuxt:对象插件支持 `setup`、`ready`、`close`。
|
|
66
|
-
|
|
67
|
-
```ts
|
|
68
|
-
import { definePlugin } from 'jax';
|
|
69
|
-
|
|
70
|
-
export default definePlugin({
|
|
71
|
-
async setup({ config }) {
|
|
72
|
-
// 初始化插件
|
|
73
|
-
},
|
|
74
|
-
async ready() {
|
|
75
|
-
// 插件初始化后执行
|
|
76
|
-
},
|
|
77
|
-
async close() {
|
|
78
|
-
// 应用退出前清理资源
|
|
79
|
-
}
|
|
80
|
-
});
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
未启用的插件不会写入调用项目的 `.jax-hono/plugins.generated.ts`,因此 `bun build` 不会解析它的运行时依赖。
|
|
84
|
-
|
|
85
|
-
### `build`
|
|
86
|
-
|
|
87
|
-
放代码生成和文件扫描逻辑。
|
|
88
|
-
|
|
89
|
-
当前 `bun run setup` 会生成:
|
|
90
|
-
|
|
91
|
-
- `.jax-hono/config.ts`
|
|
92
|
-
- `.jax-hono/controllers.generated.ts`
|
|
93
|
-
- `.jax-hono/middlewares.generated.ts`
|
|
94
|
-
- `.jax-hono/models.generated.ts`
|
|
95
|
-
- `.jax-hono/plugins.generated.ts`
|
|
96
|
-
- `.jax-hono/services.generated.ts`
|
|
97
|
-
- `.jax-hono/crons.generated.ts`
|
|
98
|
-
- `.jax-hono/index.ts`
|
|
99
|
-
|
|
100
|
-
业务代码不要手动编辑 `.jax-hono` 目录。
|
|
101
|
-
|
|
102
|
-
`.jax-hono/index.ts` 是项目级 Jax 入口,会显式 import 其它生成文件、注册到 `jax-hono/core/generated`,并重新导出 `jax-hono`。使用 Bun 编译成可执行文件时,推荐用 setup 包裹 Bun 构建命令;setup 会在执行命令期间临时把入口文件里对 `jax-hono` 的导入切到项目生成入口,命令结束后恢复源码:
|
|
103
|
-
|
|
104
|
-
```powershell
|
|
105
|
-
bun node_modules/jax-hono/setup.ts src/index.ts -- bun build src/index.ts --compile --production --target=bun-windows-x64 --outfile dist/app.exe
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
`setup.ts` 不传入口文件时只生成 `.jax-hono`。传入入口文件但不传命令时,只检查 `.jax-hono` 入口是否可用,不修改源码。真正的编译参数仍然交给 `bun build` 自己处理。
|
|
109
|
-
|
|
110
|
-
业务入口仍然写:
|
|
111
|
-
|
|
112
|
-
```ts
|
|
113
|
-
import { config, createApp } from 'jax-hono';
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
不要依赖 `jax-hono/generated` 这种包内目录或 Junction。`.jax-hono` 是每个调用项目自己的生成物;多个项目同时 link 到同一个 `jax-hono` 源码目录时,也不应该共享同一份生成结果。
|
|
117
|
-
|
|
118
|
-
如果确实需要从非项目根目录运行未编译源码,可以设置 `JAX_HONO_GENERATED_DIR` 指向当前项目的生成目录;旧项目仍可把它设为 `generated`。编译产物仍应通过 setup 包裹构建命令,让 Bun 把 `.jax-hono` 模块打进可执行文件。
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
```
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
```
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
- `this.
|
|
224
|
-
- `this.
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
- `this.
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
-
|
|
253
|
-
-
|
|
254
|
-
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
-
|
|
261
|
-
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
- `*.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
bun run
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
1
|
+
# Jax 框架说明
|
|
2
|
+
|
|
3
|
+
Jax 是当前项目内置且绑定 Hono 的轻量服务框架层,负责应用创建、路由注册、Controller/Service 基类、运行时上下文、统一响应、配置加载和代码生成。
|
|
4
|
+
|
|
5
|
+
业务代码建议从 `jax` 入口导入框架核心能力:
|
|
6
|
+
|
|
7
|
+
```ts
|
|
8
|
+
import { ApiController, Service, createApi, config } from 'jax';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
工具、错误、类型等分类能力建议走子入口;统一响应类型从 `jax` 主入口导出:
|
|
12
|
+
|
|
13
|
+
```ts
|
|
14
|
+
import { md5, createToken, escapeRegex } from 'jax/utils';
|
|
15
|
+
import { JaxHttpError } from 'jax/errors';
|
|
16
|
+
import type { ApiResponse } from 'jax';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
除非是在维护 Jax 内部代码,否则不要从 `src/jax/**` 文件路径导入。
|
|
20
|
+
|
|
21
|
+
## 目录结构
|
|
22
|
+
|
|
23
|
+
```txt
|
|
24
|
+
src/jax/
|
|
25
|
+
core/ # Hono runtime、生命周期、Controller/Service
|
|
26
|
+
middleware/ # 框架中间件
|
|
27
|
+
plugins/ # 插件定义、内置插件配置、内置插件实现
|
|
28
|
+
build/ # 代码生成/扫描注册
|
|
29
|
+
helpers/ # 框架辅助函数
|
|
30
|
+
utils/ # 更底层的纯工具
|
|
31
|
+
errors/ # 统一错误类型
|
|
32
|
+
types/ # 框架公共类型
|
|
33
|
+
.jax-hono/ # 调用项目中的自动生成注册表
|
|
34
|
+
config.ts # 配置加载入口
|
|
35
|
+
index.ts # 对业务侧暴露的统一入口
|
|
36
|
+
setup.ts # 生成配置/路由/服务/模型注册表
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## 分层边界
|
|
40
|
+
|
|
41
|
+
### `base`
|
|
42
|
+
|
|
43
|
+
放框架基类和请求上下文访问能力。
|
|
44
|
+
|
|
45
|
+
- `Controller`:Controller 基类,提供 `this.context`、`this.ctx`、`this.state`、`this.model`、`this.service`。
|
|
46
|
+
- `ApiController`:CRUD API Controller 基类,提供 `index/show/create/update/delete` 默认实现。
|
|
47
|
+
- `Service`:Service 基类,提供 `this.config`、`this.model`、`this.service` 和请求上下文访问。
|
|
48
|
+
|
|
49
|
+
业务 Controller 和 Service 应优先继承这些基类。
|
|
50
|
+
|
|
51
|
+
### `middleware`
|
|
52
|
+
|
|
53
|
+
只放框架级中间件,例如统一响应、日志、异常兜底等。
|
|
54
|
+
|
|
55
|
+
业务鉴权、后台权限、企业状态校验等应放在 `src/utils`、`src/router` 或业务模块中。
|
|
56
|
+
|
|
57
|
+
### `plugin`
|
|
58
|
+
|
|
59
|
+
放 Jax 内置插件,例如 Mongoose 插件。
|
|
60
|
+
|
|
61
|
+
插件配置参考 Egg:`src/jax/plugins/config.ts` 声明框架内置插件,业务项目通过 `src/config/plugin.ts` 显式启用或覆盖。
|
|
62
|
+
|
|
63
|
+
插件形态参考 Fastify:插件模块可以导出函数,也可以通过 `definePlugin` 导出对象。
|
|
64
|
+
|
|
65
|
+
插件生命周期参考 Adonis/Nuxt:对象插件支持 `setup`、`ready`、`close`。
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
import { definePlugin } from 'jax';
|
|
69
|
+
|
|
70
|
+
export default definePlugin({
|
|
71
|
+
async setup({ config }) {
|
|
72
|
+
// 初始化插件
|
|
73
|
+
},
|
|
74
|
+
async ready() {
|
|
75
|
+
// 插件初始化后执行
|
|
76
|
+
},
|
|
77
|
+
async close() {
|
|
78
|
+
// 应用退出前清理资源
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
未启用的插件不会写入调用项目的 `.jax-hono/plugins.generated.ts`,因此 `bun build` 不会解析它的运行时依赖。
|
|
84
|
+
|
|
85
|
+
### `build`
|
|
86
|
+
|
|
87
|
+
放代码生成和文件扫描逻辑。
|
|
88
|
+
|
|
89
|
+
当前 `bun run setup` 会生成:
|
|
90
|
+
|
|
91
|
+
- `.jax-hono/config.ts`
|
|
92
|
+
- `.jax-hono/controllers.generated.ts`
|
|
93
|
+
- `.jax-hono/middlewares.generated.ts`
|
|
94
|
+
- `.jax-hono/models.generated.ts`
|
|
95
|
+
- `.jax-hono/plugins.generated.ts`
|
|
96
|
+
- `.jax-hono/services.generated.ts`
|
|
97
|
+
- `.jax-hono/crons.generated.ts`
|
|
98
|
+
- `.jax-hono/index.ts`
|
|
99
|
+
|
|
100
|
+
业务代码不要手动编辑 `.jax-hono` 目录。
|
|
101
|
+
|
|
102
|
+
`.jax-hono/index.ts` 是项目级 Jax 入口,会显式 import 其它生成文件、注册到 `jax-hono/core/generated`,并重新导出 `jax-hono`。使用 Bun 编译成可执行文件时,推荐用 setup 包裹 Bun 构建命令;setup 会在执行命令期间临时把入口文件里对 `jax-hono` 的导入切到项目生成入口,命令结束后恢复源码:
|
|
103
|
+
|
|
104
|
+
```powershell
|
|
105
|
+
bun node_modules/jax-hono/setup.ts src/index.ts -- bun build src/index.ts --compile --production --target=bun-windows-x64 --outfile dist/app.exe
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`setup.ts` 不传入口文件时只生成 `.jax-hono`。传入入口文件但不传命令时,只检查 `.jax-hono` 入口是否可用,不修改源码。真正的编译参数仍然交给 `bun build` 自己处理。
|
|
109
|
+
|
|
110
|
+
业务入口仍然写:
|
|
111
|
+
|
|
112
|
+
```ts
|
|
113
|
+
import { config, createApp } from 'jax-hono';
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
不要依赖 `jax-hono/generated` 这种包内目录或 Junction。`.jax-hono` 是每个调用项目自己的生成物;多个项目同时 link 到同一个 `jax-hono` 源码目录时,也不应该共享同一份生成结果。
|
|
117
|
+
|
|
118
|
+
如果确实需要从非项目根目录运行未编译源码,可以设置 `JAX_HONO_GENERATED_DIR` 指向当前项目的生成目录;旧项目仍可把它设为 `generated`。编译产物仍应通过 setup 包裹构建命令,让 Bun 把 `.jax-hono` 模块打进可执行文件。
|
|
119
|
+
|
|
120
|
+
运行时会优先按当前 `cwd` 查找 `.jax-hono`,也会根据 Bun 入口脚本位置向上查找。例如 PM2 使用 `cwd: "/data/node/acs"`、`script: "acs-server/src/main.ts"` 时,框架会兼容查找 `/data/node/acs/acs-server/.jax-hono`。推荐配置仍然是把 `cwd` 指向具体项目根。
|
|
121
|
+
|
|
122
|
+
### `helpers`
|
|
123
|
+
|
|
124
|
+
放和 Jax 框架语义有关的辅助函数。
|
|
125
|
+
|
|
126
|
+
适合放这里的例子:
|
|
127
|
+
|
|
128
|
+
```ts
|
|
129
|
+
normalizeRoutePath()
|
|
130
|
+
getPagination()
|
|
131
|
+
getClientIp()
|
|
132
|
+
assertRequestContext()
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
如果函数依赖 Hono Context、Jax Context、路由、响应、Controller 生命周期等框架概念,优先放在 `helpers`。
|
|
136
|
+
|
|
137
|
+
### `utils`
|
|
138
|
+
|
|
139
|
+
放无框架依赖的纯工具函数。
|
|
140
|
+
|
|
141
|
+
适合放这里的例子:
|
|
142
|
+
|
|
143
|
+
```ts
|
|
144
|
+
arrayFrom()
|
|
145
|
+
escapeRegex()
|
|
146
|
+
md5()
|
|
147
|
+
createToken()
|
|
148
|
+
isPlainObject()
|
|
149
|
+
safeJsonParse()
|
|
150
|
+
sleep()
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
如果函数复制到任意 TypeScript 项目都成立,可以放在 `utils`。
|
|
154
|
+
|
|
155
|
+
### `errors`
|
|
156
|
+
|
|
157
|
+
放框架统一错误类型。
|
|
158
|
+
|
|
159
|
+
当前提供:
|
|
160
|
+
|
|
161
|
+
```ts
|
|
162
|
+
throw new JaxHttpError('没有权限', 403);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
后续可以在这里扩展 `JaxValidationError`、`JaxAuthError` 等。
|
|
166
|
+
|
|
167
|
+
### `response`
|
|
168
|
+
|
|
169
|
+
放统一响应结构和响应构造函数。
|
|
170
|
+
|
|
171
|
+
当前 API 响应格式:
|
|
172
|
+
|
|
173
|
+
```ts
|
|
174
|
+
{
|
|
175
|
+
code: 0,
|
|
176
|
+
msg: 'success',
|
|
177
|
+
data: {}
|
|
178
|
+
}
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
失败响应格式:
|
|
182
|
+
|
|
183
|
+
```ts
|
|
184
|
+
{
|
|
185
|
+
code: 1,
|
|
186
|
+
msg: '错误信息'
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
业务 API 中继续使用:
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
return c.ok(data);
|
|
194
|
+
return c.fail('操作失败');
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### `types`
|
|
198
|
+
|
|
199
|
+
放框架公共类型,例如 Jax 上下文变量、状态、扩展类型。
|
|
200
|
+
|
|
201
|
+
业务侧需要类型时优先从 `jax/types` 导入:
|
|
202
|
+
|
|
203
|
+
```ts
|
|
204
|
+
import type { JaxState } from 'jax/types';
|
|
205
|
+
```
|
|
206
|
+
|
|
207
|
+
## 业务代码推荐写法
|
|
208
|
+
|
|
209
|
+
### Controller
|
|
210
|
+
|
|
211
|
+
```ts
|
|
212
|
+
import { ApiController } from 'jax';
|
|
213
|
+
|
|
214
|
+
export default class CompanyController extends ApiController {
|
|
215
|
+
protected get Model() {
|
|
216
|
+
return this.model.Company;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Controller 中推荐使用:
|
|
222
|
+
|
|
223
|
+
- `this.model.Xxx` 访问模型
|
|
224
|
+
- `this.service.xxx` 访问服务
|
|
225
|
+
- `this.state` 访问请求状态
|
|
226
|
+
- `this.context` / `this.ctx` 访问 Hono Context
|
|
227
|
+
|
|
228
|
+
### Service
|
|
229
|
+
|
|
230
|
+
```ts
|
|
231
|
+
import { Service } from 'jax';
|
|
232
|
+
|
|
233
|
+
export default class CompanyService extends Service {
|
|
234
|
+
async getCompanyInfo(companyId: string) {
|
|
235
|
+
return this.model.Company.findById(companyId).lean();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
```
|
|
239
|
+
|
|
240
|
+
Service 中推荐使用:
|
|
241
|
+
|
|
242
|
+
- `this.config` 访问配置
|
|
243
|
+
- `this.model.Xxx` 访问模型
|
|
244
|
+
- `this.service.xxx` 访问其他服务
|
|
245
|
+
|
|
246
|
+
不建议在业务文件里直接 import 具体 model 或 service,除非是在做类型声明、纯工具函数或非常明确的底层实现。
|
|
247
|
+
|
|
248
|
+
## 什么应该放进 Jax
|
|
249
|
+
|
|
250
|
+
可以放入 Jax:
|
|
251
|
+
|
|
252
|
+
- 所有项目都可复用的框架能力
|
|
253
|
+
- Hono/Jax 上下文相关 helper
|
|
254
|
+
- Controller/Service 生命周期相关能力
|
|
255
|
+
- 统一响应、错误、分页、路由注册
|
|
256
|
+
- 代码生成、自动注册、配置加载
|
|
257
|
+
|
|
258
|
+
不建议放入 Jax:
|
|
259
|
+
|
|
260
|
+
- 企业、车辆、危废、后台账号等业务概念
|
|
261
|
+
- 某个接口专用的数据转换
|
|
262
|
+
- 某个业务模块专属常量
|
|
263
|
+
- 和当前项目强绑定的鉴权策略
|
|
264
|
+
|
|
265
|
+
简单判断:
|
|
266
|
+
|
|
267
|
+
> 换一个 Jax 项目仍然成立,放 `src/jax`。只在这个业务里成立,放 `src/utils` 或具体业务模块。
|
|
268
|
+
|
|
269
|
+
## 扩展规范
|
|
270
|
+
|
|
271
|
+
新增框架能力时优先按下面顺序判断位置:
|
|
272
|
+
|
|
273
|
+
1. 是 Hono runtime、生命周期、路由扩展或基类,放 `core`。
|
|
274
|
+
2. 是框架中间件,放 `middleware`。
|
|
275
|
+
3. 是插件定义、内置插件配置或内置插件实现,放 `plugins`。
|
|
276
|
+
4. 是框架语义 helper,放 `helpers`。
|
|
277
|
+
4. 是纯函数工具,放 `utils`。
|
|
278
|
+
5. 是错误类型,放 `errors`。
|
|
279
|
+
6. 是响应结构,放 `response`。
|
|
280
|
+
7. 是公共类型,放 `types`。
|
|
281
|
+
|
|
282
|
+
新增文件后,如果业务侧需要使用,应优先在对应子入口导出,例如 `src/jax/utils/index.ts`、`src/jax/errors/index.ts`。只有框架核心 API 才放到 `src/jax/index.ts`。
|
|
283
|
+
|
|
284
|
+
内置插件配置放在 `plugins/config.ts`,内置插件实现放在 `plugins/*`,项目级插件通过 `src/config/plugin.ts` 显式启用或覆盖。生成器只扫描已启用插件中的约定文件,不扫描未启用插件。
|
|
285
|
+
|
|
286
|
+
已启用插件可以提供:
|
|
287
|
+
|
|
288
|
+
- `*.controller.ts`:注册到 `controllers` 根对象
|
|
289
|
+
- `*.service.ts`:注册到 `services.generated.ts`
|
|
290
|
+
- `*.cron.ts`:注册到 `crons.generated.ts`,由框架统一启动/停止
|
|
291
|
+
|
|
292
|
+
未启用插件不会进入生成结果,也不会让构建解析它的运行时依赖。
|
|
293
|
+
|
|
294
|
+
### `cron`
|
|
295
|
+
|
|
296
|
+
定时任务可以放在项目根级 `src/cron` / `src/crons` 目录,也可以放在模块或已启用插件中:
|
|
297
|
+
|
|
298
|
+
```text
|
|
299
|
+
src/cron/report.cron.ts
|
|
300
|
+
src/modules/oss/oss-trash.cron.ts
|
|
301
|
+
plugins/foo/foo-cleanup.cron.ts
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
Cron 文件导出 `defineCron()`、`cron` 或 `jobs` 即可被生成器识别:
|
|
305
|
+
|
|
306
|
+
```ts
|
|
307
|
+
import { defineCron } from 'jax-hono';
|
|
308
|
+
|
|
309
|
+
export default defineCron({
|
|
310
|
+
name: 'daily-cleanup',
|
|
311
|
+
cron: '0 0 * * *',
|
|
312
|
+
immediate: true,
|
|
313
|
+
async run(ctx) {
|
|
314
|
+
// ctx.app / ctx.config / ctx.model / ctx.service / ctx.plugin / ctx.signal
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
框架会在应用 ready 后统一启动定时任务,在 `app.close()` 时统一停止,不需要每个任务在入口文件手动声明。
|
|
320
|
+
|
|
321
|
+
## 常用命令
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
bun run setup
|
|
325
|
+
bun run dev
|
|
326
|
+
bun run build
|
|
327
|
+
```
|
|
328
|
+
|
|
329
|
+
`setup` 会重新扫描并生成 Jax 注册表;新增 model、service、controller、middleware、config 后建议先执行一次。
|