wok-server 0.5.0 → 0.7.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.
Files changed (380) hide show
  1. package/README.en.md +61 -0
  2. package/README.md +44 -29
  3. package/dist/cache/cache.js +98 -98
  4. package/dist/cache/config.js +19 -19
  5. package/dist/cache/index.js +27 -27
  6. package/dist/cache/purge-task.js +46 -46
  7. package/dist/cache/stat.js +47 -47
  8. package/dist/config/convert.js +36 -36
  9. package/dist/config/exception.js +14 -14
  10. package/dist/config/index.js +81 -81
  11. package/dist/http-client/index.js +136 -136
  12. package/dist/i18n/ar.js +17 -17
  13. package/dist/i18n/de.js +17 -17
  14. package/dist/i18n/en-us.js +17 -17
  15. package/dist/i18n/es.js +17 -17
  16. package/dist/i18n/fr.js +17 -17
  17. package/dist/i18n/i18n.js +231 -231
  18. package/dist/i18n/index.js +52 -52
  19. package/dist/i18n/ja.js +17 -17
  20. package/dist/i18n/ko.js +17 -17
  21. package/dist/i18n/msg.js +2 -2
  22. package/dist/i18n/pt.js +17 -17
  23. package/dist/i18n/ru.js +17 -17
  24. package/dist/i18n/tag.js +18 -18
  25. package/dist/i18n/zh-HK.js +17 -17
  26. package/dist/i18n/zh-TW.js +17 -17
  27. package/dist/i18n/zh-cn.js +17 -17
  28. package/dist/index.js +14 -14
  29. package/dist/lock/index.js +114 -114
  30. package/dist/log/config.js +35 -35
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -198
  33. package/dist/log/index.js +135 -135
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -56
  36. package/dist/log/store.js +19 -19
  37. package/dist/mongodb/collection.js +2 -2
  38. package/dist/mongodb/config.js +34 -34
  39. package/dist/mongodb/doc.js +2 -2
  40. package/dist/mongodb/exception.js +14 -14
  41. package/dist/mongodb/index.js +58 -58
  42. package/dist/mongodb/manager/base.js +563 -563
  43. package/dist/mongodb/manager/index.js +63 -63
  44. package/dist/mongodb/manager/tx-strict.js +84 -84
  45. package/dist/mongodb/manager/tx.js +30 -30
  46. package/dist/mongodb/migration.js +52 -52
  47. package/dist/mvc/access-log.js +33 -33
  48. package/dist/mvc/config.js +27 -27
  49. package/dist/mvc/exchange.js +113 -113
  50. package/dist/mvc/handler/index.js +7 -6
  51. package/dist/mvc/handler/json.js +65 -65
  52. package/dist/mvc/handler/restful.js +35 -35
  53. package/dist/mvc/handler/sse.js +65 -0
  54. package/dist/mvc/handler/upload.js +31 -31
  55. package/dist/mvc/index.js +50 -50
  56. package/dist/mvc/interceptor.js +2 -2
  57. package/dist/mvc/query.js +43 -43
  58. package/dist/mvc/render/file.js +132 -132
  59. package/dist/mvc/render/html/html.js +90 -90
  60. package/dist/mvc/render/html/index.js +18 -18
  61. package/dist/mvc/render/html/style.js +2 -2
  62. package/dist/mvc/render/index.js +7 -7
  63. package/dist/mvc/render/json.js +26 -26
  64. package/dist/mvc/render/text.js +16 -16
  65. package/dist/mvc/router.js +2 -2
  66. package/dist/mvc/server.js +272 -272
  67. package/dist/mvc/static/header.js +67 -67
  68. package/dist/mvc/static/index.js +6 -6
  69. package/dist/mvc/static/mime-type.js +84 -84
  70. package/dist/mvc/static/server-cache-config.js +66 -66
  71. package/dist/mvc/static/server-cache.js +133 -133
  72. package/dist/mvc/static/static-handler.js +372 -372
  73. package/dist/mysql/config.js +51 -51
  74. package/dist/mysql/exception.js +14 -14
  75. package/dist/mysql/index.js +87 -87
  76. package/dist/mysql/manager/base.js +278 -239
  77. package/dist/mysql/manager/index.js +107 -107
  78. package/dist/mysql/manager/ops/count.js +20 -20
  79. package/dist/mysql/manager/ops/criteria.js +381 -356
  80. package/dist/mysql/manager/ops/delete.js +59 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +149 -169
  83. package/dist/mysql/manager/ops/index.js +16 -14
  84. package/dist/mysql/manager/ops/insert.js +132 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/order-by.js +28 -0
  87. package/dist/mysql/manager/ops/paginate.js +48 -23
  88. package/dist/mysql/manager/ops/query.js +9 -9
  89. package/dist/mysql/manager/ops/update.js +222 -216
  90. package/dist/mysql/manager/ops/upsert.js +178 -0
  91. package/dist/mysql/manager/ops/utils.js +28 -24
  92. package/dist/mysql/manager/tx-strict.js +103 -103
  93. package/dist/mysql/manager/tx.js +30 -30
  94. package/dist/mysql/manager/utils.js +56 -56
  95. package/dist/mysql/migration.js +136 -136
  96. package/dist/mysql/table-info.js +8 -8
  97. package/dist/task/daily.js +59 -59
  98. package/dist/task/fixed-delay.js +38 -38
  99. package/dist/task/fixed-rate.js +42 -42
  100. package/dist/task/index.js +9 -9
  101. package/dist/task/task.js +56 -56
  102. package/dist/validation/exception.js +36 -36
  103. package/dist/validation/index.js +40 -40
  104. package/dist/validation/validator/array.js +34 -34
  105. package/dist/validation/validator/enum.js +28 -28
  106. package/dist/validation/validator/index.js +14 -14
  107. package/dist/validation/validator/length.js +40 -40
  108. package/dist/validation/validator/max-length.js +35 -35
  109. package/dist/validation/validator/max.js +29 -29
  110. package/dist/validation/validator/min-length.js +33 -33
  111. package/dist/validation/validator/min.js +29 -29
  112. package/dist/validation/validator/not-blank.js +33 -33
  113. package/dist/validation/validator/not-null.js +21 -21
  114. package/dist/validation/validator/plain-obj.js +32 -32
  115. package/dist/validation/validator/regexp.js +34 -34
  116. package/documentation/en/cache.md +56 -0
  117. package/documentation/en/config.md +96 -0
  118. package/documentation/en/engineering.md +256 -0
  119. package/documentation/en/http-client.md +32 -0
  120. package/documentation/en/i18n.md +143 -0
  121. package/documentation/en/index.md +24 -0
  122. package/documentation/en/lock.md +51 -0
  123. package/documentation/en/log.md +109 -0
  124. package/documentation/en/mongodb.md +256 -0
  125. package/documentation/en/mvc.md +688 -0
  126. package/documentation/en/mysql.md +682 -0
  127. package/documentation/en/task.md +45 -0
  128. package/documentation/en/test.md +56 -0
  129. package/documentation/en/validate.md +130 -0
  130. package/documentation/zh-cn/mvc.md +66 -24
  131. package/documentation/zh-cn/mysql.md +146 -17
  132. package/package.json +4 -1
  133. package/skills/wok-server-api-rules/SKILL.md +350 -0
  134. package/skills/wok-server-cache/SKILL.md +216 -0
  135. package/skills/wok-server-code-navigation/SKILL.md +153 -0
  136. package/skills/wok-server-config/SKILL.md +200 -0
  137. package/skills/wok-server-getting-started/SKILL.md +123 -0
  138. package/skills/wok-server-getting-started/references/engineering.md +169 -0
  139. package/skills/wok-server-http-client/SKILL.md +164 -0
  140. package/skills/wok-server-i18n/SKILL.md +214 -0
  141. package/skills/wok-server-lock/SKILL.md +144 -0
  142. package/skills/wok-server-log/SKILL.md +218 -0
  143. package/skills/wok-server-mongodb/SKILL.md +235 -0
  144. package/skills/wok-server-mvc/SKILL.md +251 -0
  145. package/skills/wok-server-mvc/references/respond-html.md +157 -0
  146. package/skills/wok-server-mvc/references/sse.md +121 -0
  147. package/skills/wok-server-mvc/references/static-files.md +47 -0
  148. package/skills/wok-server-mvc/references/upload.md +62 -0
  149. package/skills/wok-server-mvc/references/websocket.md +30 -0
  150. package/skills/wok-server-mysql/SKILL.md +388 -0
  151. package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
  152. package/skills/wok-server-mysql/references/version-control.md +22 -0
  153. package/skills/wok-server-task/SKILL.md +158 -0
  154. package/skills/wok-server-validate/SKILL.md +167 -0
  155. package/src/cache/cache.ts +118 -0
  156. package/src/cache/config.ts +53 -0
  157. package/src/cache/index.ts +27 -0
  158. package/src/cache/purge-task.ts +53 -0
  159. package/src/cache/stat.ts +47 -0
  160. package/src/config/convert.ts +27 -0
  161. package/src/config/exception.ts +8 -0
  162. package/src/config/index.ts +92 -0
  163. package/src/http-client/index.ts +202 -0
  164. package/src/i18n/ar.ts +16 -0
  165. package/src/i18n/de.ts +16 -0
  166. package/src/i18n/en-us.ts +16 -0
  167. package/src/i18n/es.ts +16 -0
  168. package/src/i18n/fr.ts +16 -0
  169. package/src/i18n/i18n.ts +230 -0
  170. package/src/i18n/index.ts +50 -0
  171. package/src/i18n/ja.ts +16 -0
  172. package/src/i18n/ko.ts +16 -0
  173. package/src/i18n/msg.ts +50 -0
  174. package/src/i18n/pt.ts +16 -0
  175. package/src/i18n/ru.ts +16 -0
  176. package/src/i18n/tag.ts +18 -0
  177. package/src/i18n/zh-HK.ts +16 -0
  178. package/src/i18n/zh-TW.ts +16 -0
  179. package/src/i18n/zh-cn.ts +16 -0
  180. package/src/index.ts +11 -0
  181. package/src/lock/index.ts +164 -0
  182. package/src/log/config.ts +71 -0
  183. package/src/log/date.ts +19 -0
  184. package/src/log/file.ts +215 -0
  185. package/src/log/index.ts +136 -0
  186. package/src/log/level.ts +29 -0
  187. package/src/log/log.ts +77 -0
  188. package/src/log/store.ts +31 -0
  189. package/src/mongodb/collection.ts +25 -0
  190. package/src/mongodb/config.ts +69 -0
  191. package/src/mongodb/doc.ts +12 -0
  192. package/src/mongodb/exception.ts +8 -0
  193. package/src/mongodb/index.ts +71 -0
  194. package/src/mongodb/manager/base.ts +674 -0
  195. package/src/mongodb/manager/index.ts +80 -0
  196. package/src/mongodb/manager/tx-strict.ts +153 -0
  197. package/src/mongodb/manager/tx.ts +34 -0
  198. package/src/mongodb/migration.ts +66 -0
  199. package/src/mvc/access-log.ts +33 -0
  200. package/src/mvc/config.ts +70 -0
  201. package/src/mvc/exchange.ts +126 -0
  202. package/src/mvc/handler/index.ts +4 -0
  203. package/src/mvc/handler/json.ts +96 -0
  204. package/src/mvc/handler/restful.ts +39 -0
  205. package/src/mvc/handler/sse.ts +90 -0
  206. package/src/mvc/handler/upload.ts +54 -0
  207. package/src/mvc/index.ts +48 -0
  208. package/src/mvc/interceptor.ts +12 -0
  209. package/src/mvc/query.ts +36 -0
  210. package/src/mvc/render/file.ts +148 -0
  211. package/src/mvc/render/html/html.ts +187 -0
  212. package/src/mvc/render/html/index.ts +16 -0
  213. package/src/mvc/render/html/style.ts +1201 -0
  214. package/src/mvc/render/index.ts +4 -0
  215. package/src/mvc/render/json.ts +24 -0
  216. package/src/mvc/render/text.ts +14 -0
  217. package/src/mvc/router.ts +13 -0
  218. package/src/mvc/server.ts +315 -0
  219. package/src/mvc/static/header.ts +86 -0
  220. package/src/mvc/static/index.ts +3 -0
  221. package/src/mvc/static/mime-type.ts +81 -0
  222. package/src/mvc/static/server-cache-config.ts +92 -0
  223. package/src/mvc/static/server-cache.ts +171 -0
  224. package/src/mvc/static/static-handler.ts +445 -0
  225. package/src/mysql/config.ts +130 -0
  226. package/src/mysql/exception.ts +8 -0
  227. package/src/mysql/index.ts +88 -0
  228. package/src/mysql/manager/base.ts +332 -0
  229. package/src/mysql/manager/index.ts +112 -0
  230. package/src/mysql/manager/ops/count.ts +30 -0
  231. package/src/mysql/manager/ops/criteria.ts +446 -0
  232. package/src/mysql/manager/ops/delete.ts +91 -0
  233. package/src/mysql/manager/ops/exist.ts +41 -0
  234. package/src/mysql/manager/ops/find.ts +209 -0
  235. package/src/mysql/manager/ops/index.ts +13 -0
  236. package/src/mysql/manager/ops/insert.ts +158 -0
  237. package/src/mysql/manager/ops/modify.ts +14 -0
  238. package/src/mysql/manager/ops/order-by.ts +58 -0
  239. package/src/mysql/manager/ops/paginate.ts +100 -0
  240. package/src/mysql/manager/ops/query.ts +13 -0
  241. package/src/mysql/manager/ops/update.ts +318 -0
  242. package/src/mysql/manager/ops/upsert.ts +224 -0
  243. package/src/mysql/manager/ops/utils.ts +24 -0
  244. package/src/mysql/manager/tx-strict.ts +138 -0
  245. package/src/mysql/manager/tx.ts +31 -0
  246. package/src/mysql/manager/utils.ts +75 -0
  247. package/src/mysql/migration.ts +149 -0
  248. package/src/mysql/table-info.ts +41 -0
  249. package/src/task/daily.ts +70 -0
  250. package/src/task/fixed-delay.ts +45 -0
  251. package/src/task/fixed-rate.ts +49 -0
  252. package/src/task/index.ts +4 -0
  253. package/src/task/task.ts +70 -0
  254. package/src/validation/exception.ts +27 -0
  255. package/src/validation/index.ts +61 -0
  256. package/src/validation/validator/array.ts +32 -0
  257. package/src/validation/validator/enum.ts +25 -0
  258. package/src/validation/validator/index.ts +11 -0
  259. package/src/validation/validator/length.ts +42 -0
  260. package/src/validation/validator/max-length.ts +33 -0
  261. package/src/validation/validator/max.ts +26 -0
  262. package/src/validation/validator/min-length.ts +31 -0
  263. package/src/validation/validator/min.ts +26 -0
  264. package/src/validation/validator/not-blank.ts +31 -0
  265. package/src/validation/validator/not-null.ts +19 -0
  266. package/src/validation/validator/plain-obj.ts +30 -0
  267. package/src/validation/validator/regexp.ts +32 -0
  268. package/types/cache/cache.d.ts +52 -52
  269. package/types/cache/config.d.ts +32 -32
  270. package/types/cache/index.d.ts +2 -2
  271. package/types/cache/purge-task.d.ts +11 -11
  272. package/types/cache/stat.d.ts +26 -26
  273. package/types/config/convert.d.ts +6 -6
  274. package/types/config/exception.d.ts +7 -7
  275. package/types/config/index.d.ts +25 -25
  276. package/types/http-client/index.d.ts +71 -71
  277. package/types/i18n/ar.d.ts +2 -2
  278. package/types/i18n/de.d.ts +2 -2
  279. package/types/i18n/en-us.d.ts +2 -2
  280. package/types/i18n/es.d.ts +2 -2
  281. package/types/i18n/fr.d.ts +2 -2
  282. package/types/i18n/i18n.d.ts +102 -102
  283. package/types/i18n/index.d.ts +9 -9
  284. package/types/i18n/ja.d.ts +2 -2
  285. package/types/i18n/ko.d.ts +2 -2
  286. package/types/i18n/msg.d.ts +50 -50
  287. package/types/i18n/pt.d.ts +2 -2
  288. package/types/i18n/ru.d.ts +2 -2
  289. package/types/i18n/tag.d.ts +11 -11
  290. package/types/i18n/zh-HK.d.ts +2 -2
  291. package/types/i18n/zh-TW.d.ts +2 -2
  292. package/types/i18n/zh-cn.d.ts +2 -2
  293. package/types/index.d.ts +11 -11
  294. package/types/lock/index.d.ts +64 -64
  295. package/types/log/config.d.ts +35 -35
  296. package/types/log/date.d.ts +2 -2
  297. package/types/log/file.d.ts +13 -13
  298. package/types/log/index.d.ts +53 -53
  299. package/types/log/level.d.ts +14 -14
  300. package/types/log/log.d.ts +40 -40
  301. package/types/log/store.d.ts +19 -19
  302. package/types/mongodb/collection.d.ts +25 -25
  303. package/types/mongodb/config.d.ts +45 -45
  304. package/types/mongodb/doc.d.ts +11 -11
  305. package/types/mongodb/exception.d.ts +7 -7
  306. package/types/mongodb/index.d.ts +29 -29
  307. package/types/mongodb/manager/base.d.ts +188 -188
  308. package/types/mongodb/manager/index.d.ts +38 -38
  309. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  310. package/types/mongodb/manager/tx.d.ts +21 -21
  311. package/types/mongodb/migration.d.ts +12 -12
  312. package/types/mvc/access-log.d.ts +7 -7
  313. package/types/mvc/config.d.ts +42 -42
  314. package/types/mvc/exchange.d.ts +72 -72
  315. package/types/mvc/handler/index.d.ts +4 -3
  316. package/types/mvc/handler/json.d.ts +44 -44
  317. package/types/mvc/handler/restful.d.ts +11 -11
  318. package/types/mvc/handler/sse.d.ts +34 -0
  319. package/types/mvc/handler/upload.d.ts +36 -36
  320. package/types/mvc/index.d.ts +22 -22
  321. package/types/mvc/interceptor.d.ts +11 -11
  322. package/types/mvc/query.d.ts +13 -13
  323. package/types/mvc/render/file.d.ts +10 -10
  324. package/types/mvc/render/html/html.d.ts +98 -98
  325. package/types/mvc/render/html/index.d.ts +11 -11
  326. package/types/mvc/render/html/style.d.ts +1201 -1201
  327. package/types/mvc/render/index.d.ts +4 -4
  328. package/types/mvc/render/json.d.ts +17 -17
  329. package/types/mvc/render/text.d.ts +10 -10
  330. package/types/mvc/router.d.ts +11 -11
  331. package/types/mvc/server.d.ts +90 -90
  332. package/types/mvc/static/header.d.ts +27 -27
  333. package/types/mvc/static/index.d.ts +3 -3
  334. package/types/mvc/static/mime-type.d.ts +2 -2
  335. package/types/mvc/static/server-cache-config.d.ts +30 -30
  336. package/types/mvc/static/server-cache.d.ts +76 -76
  337. package/types/mvc/static/static-handler.d.ts +77 -77
  338. package/types/mysql/config.d.ts +90 -90
  339. package/types/mysql/exception.d.ts +7 -7
  340. package/types/mysql/index.d.ts +16 -16
  341. package/types/mysql/manager/base.d.ts +196 -165
  342. package/types/mysql/manager/index.d.ts +36 -36
  343. package/types/mysql/manager/ops/count.d.ts +13 -13
  344. package/types/mysql/manager/ops/criteria.d.ts +144 -134
  345. package/types/mysql/manager/ops/delete.d.ts +47 -46
  346. package/types/mysql/manager/ops/exist.d.ts +6 -6
  347. package/types/mysql/manager/ops/find.d.ts +87 -86
  348. package/types/mysql/manager/ops/index.d.ts +12 -10
  349. package/types/mysql/manager/ops/insert.d.ts +32 -18
  350. package/types/mysql/manager/ops/modify.d.ts +3 -3
  351. package/types/mysql/manager/ops/order-by.d.ts +38 -0
  352. package/types/mysql/manager/ops/paginate.d.ts +53 -36
  353. package/types/mysql/manager/ops/query.d.ts +3 -3
  354. package/types/mysql/manager/ops/update.d.ts +99 -76
  355. package/types/mysql/manager/ops/upsert.d.ts +36 -0
  356. package/types/mysql/manager/ops/utils.d.ts +5 -5
  357. package/types/mysql/manager/tx-strict.d.ts +36 -36
  358. package/types/mysql/manager/tx.d.ts +15 -15
  359. package/types/mysql/manager/utils.d.ts +17 -17
  360. package/types/mysql/migration.d.ts +8 -8
  361. package/types/mysql/table-info.d.ts +36 -36
  362. package/types/task/daily.d.ts +16 -16
  363. package/types/task/fixed-delay.d.ts +9 -9
  364. package/types/task/fixed-rate.d.ts +9 -9
  365. package/types/task/index.d.ts +4 -4
  366. package/types/task/task.d.ts +34 -34
  367. package/types/validation/exception.d.ts +38 -38
  368. package/types/validation/index.d.ts +32 -32
  369. package/types/validation/validator/array.d.ts +5 -5
  370. package/types/validation/validator/enum.d.ts +8 -8
  371. package/types/validation/validator/index.d.ts +11 -11
  372. package/types/validation/validator/length.d.ts +10 -10
  373. package/types/validation/validator/max-length.d.ts +8 -8
  374. package/types/validation/validator/max.d.ts +7 -7
  375. package/types/validation/validator/min-length.d.ts +6 -6
  376. package/types/validation/validator/min.d.ts +7 -7
  377. package/types/validation/validator/not-blank.d.ts +7 -7
  378. package/types/validation/validator/not-null.d.ts +6 -6
  379. package/types/validation/validator/plain-obj.d.ts +7 -7
  380. package/types/validation/validator/regexp.d.ts +8 -8
@@ -0,0 +1,153 @@
1
+ ---
2
+ name: wok-server-code-navigation
3
+ description: 教你如何读懂一个 wok-server 项目的代码结构,快速定位目标文件。
4
+ license: MIT
5
+ metadata:
6
+ author: Peak Tai
7
+ email: peaktai@qq.com
8
+ ---
9
+
10
+ # wok-server 项目代码导航
11
+
12
+ ## 概述
13
+
14
+ 面对一个 wok-server 项目时,按以下路径快速理解项目结构、定位目标代码。核心原则:**项目按功能划分目录,路由集中配置,每个接口/拦截器独立一个文件**。
15
+
16
+ ## 项目入口 — main.ts
17
+
18
+ 入口文件在 `src/main.ts`,包含:
19
+
20
+ 1. 全局初始化(如 `Date.prototype.toJSON`、`enableMysql()`)
21
+ 2. `startWebServer()` 调用,配置 routers 和 interceptors
22
+ 3. 任务调度(`scheduleWithFixedDelay` 等)
23
+
24
+ **所以 `main.ts` 是读懂项目的第一个文件**。从这里可以看到所有路由映射和拦截器链。
25
+
26
+ ## 路由定位决策树
27
+
28
+ ```
29
+ 要找一个接口的处理逻辑?
30
+ → 打开 src/main.ts(或 src/router.ts)
31
+ → 找到路由对象中对应路径的 key
32
+ → 看它的 value(通常是 import 的 handler 函数)
33
+ → Ctrl/Cmd + 点击跳转到 handler 文件
34
+ ```
35
+
36
+ 路由集中在一个地方,所以**搜路由路径就能找到对应 handler 的 import**。
37
+
38
+ ## 文件定位速查表
39
+
40
+ | 想找什么 | 去哪里找 |
41
+ | ------------------------ | -------------------------------------------------------------- |
42
+ | 入口、路由注册、启动逻辑 | `src/main.ts` |
43
+ | 路由配置(大项目) | `src/router.ts` 或 `src/router/` 目录 |
44
+ | 某个接口的处理逻辑 | `src/{功能名}/{接口名}.ts`(如 `src/user/create-user.ts`) |
45
+ | 拦截器 | `src/{功能名}/{拦截器名}-interceptor.ts` 或 `src/exception.ts` |
46
+ | 数据库实体与表定义 | `src/{功能名}/{功能名}.ts`(如 `user/user.ts`) |
47
+ | MySQL 迁移脚本 | `db_migration/` 目录 |
48
+ | 环境变量 | 项目根目录 `.env` |
49
+
50
+ ## 目录结构速览
51
+
52
+ ```
53
+ 根目录
54
+ ├── db_migration/ # MySQL 迁移文件
55
+ ├── src/
56
+ │ ├── auth/ # 授权功能
57
+ │ │ ├── auth.ts # 实体配置(表结构)
58
+ │ │ ├── auth-interceptor.ts # 授权拦截器
59
+ │ │ ├── create-auth.ts # 创建授权接口
60
+ │ │ └── index.ts # 包入口,聚合导出
61
+ │ ├── user/ # 用户功能
62
+ │ │ ├── user.ts
63
+ │ │ ├── create-user.ts
64
+ │ │ └── index.ts
65
+ │ ├── exception.ts # 全局异常定义 + 异常拦截器
66
+ │ ├── router.ts # 路由集中配置(大项目)
67
+ │ └── main.ts # 入口文件(小项目路由也在这里)
68
+ ├── .env
69
+ ├── package.json
70
+ └── tsconfig.json
71
+ ```
72
+
73
+ ## 阅读项目的步骤
74
+
75
+ ### 第一步:看 main.ts
76
+
77
+ 打开 `src/main.ts`,关注三个区域:
78
+
79
+ 1. **顶部 import** — 了解项目用了哪些 wok-server 功能模块(MySQL?MongoDB?Task?)
80
+ 2. **startWebServer() 调用** — 了解有哪些路由和拦截器
81
+ 3. **任务调度调用** — 了解有哪些定时任务
82
+
83
+ ### 第二步:看路由表
84
+
85
+ 从 `main.ts` 的 routers 对象中找到你关心的路径,跳转到对应 handler。
86
+
87
+ ### 第三步:看拦截器链
88
+
89
+ 从 `main.ts` 的 interceptors 数组了解请求处理流程。典型链路:
90
+
91
+ ```
92
+ 请求 → globalErrorInterceptor → authInterceptor → handler
93
+ ```
94
+
95
+ ### 第四步:按需看业务目录
96
+
97
+ 根据 handler 文件所在的目录,查看同目录下的:
98
+
99
+ - `{功能}.ts` — 了解数据实体结构
100
+ - `{功能}-interceptor.ts` — 了解功能级拦截逻辑
101
+ - 其他 handler 文件 — 了解该功能的完整接口
102
+
103
+ ## 常见查找场景
104
+
105
+ ### 场景 1:我要改一个接口的逻辑
106
+
107
+ 1. 从路由路径反查 handler 文件(搜路径字符串)
108
+ 2. 打开 handler 文件,找到 `handle()` 函数体
109
+ 3. 修改逻辑
110
+
111
+ ### 场景 2:我要新增一个接口
112
+
113
+ 1. 在对应功能目录下新建 `xxx.ts`
114
+ 2. 用 `createJsonHandler` 或其他工厂函数创建 handler
115
+ 3. 在 `src/main.ts` 或 `src/router.ts` 中注册路由
116
+
117
+ ### 场景 3:我要查某个表的结构
118
+
119
+ 1. 找 `src/{功能名}/{功能名}.ts`(如 `user/user.ts`)
120
+ 2. 查看 `Table` 对象定义(表名、列、ID 字段等)
121
+
122
+ ### 场景 4:项目可能封装了自定义 Handler
123
+
124
+ wok-server 内置的 handler 工厂函数(`createJsonHandler`、`createUploadHandler`、`createSseHandler`、`restful`)在真实项目中经常被二次封装。例如:
125
+
126
+ ```ts
127
+ // 项目可能定义了 createAuthJsonHandler,在 createJsonHandler 基础上注入用户信息
128
+ export function createAuthJsonHandler<Req, Resp>(opts) {
129
+ return createJsonHandler<Req, Resp>({
130
+ ...opts,
131
+ async handle(body, exchange) {
132
+ const auth = new Auth(exchange) // 增加 auth 信息
133
+ return opts.handle(body, exchange, auth)
134
+ }
135
+ })
136
+ }
137
+ ```
138
+
139
+ **面对一个项目时,先搜索以下关键词,判断项目是否有自定义封装:**
140
+
141
+ - 搜 `createJsonHandler` —— 如果没有匹配,说明项目可能用了自定义封装
142
+ - 搜 `create.*Handler` 或 `create.*Json` —— 发现自定义的 handler 工厂函数
143
+ - 搜 `from 'wok-server'` 中的 `createJsonHandler` —— 确认哪些文件直接用了内置版本
144
+ - 后续搜索接口文件时,用自定义函数名而非内置名
145
+
146
+ ### 场景 5:找不到目标文件?
147
+
148
+ 1. **首先检查路由注册** — 搜路由路径字符串,定位 handler 的 import 来源
149
+ 2. 全文搜索 `createJsonHandler` —— 列出直接使用内置工厂的 JSON 接口
150
+ 3. 全文搜索 `create.*Handler` —— 发现自定义封装的 handler 工厂及使用位置
151
+ 4. 全文搜索 `Table<` —— 列出所有数据表定义
152
+ 5. 全文搜索 `Interceptor` —— 列出所有拦截器
153
+ 6. 全文搜索 `schedule` —— 列出所有定时任务
@@ -0,0 +1,200 @@
1
+ ---
2
+ name: wok-server-config
3
+ description: wok-server 配置组件使用指南,将配置对象与环境变量映射,支持类型转换和校验。
4
+ license: MIT
5
+ metadata:
6
+ author: Peak Tai
7
+ email: peaktai@qq.com
8
+ ---
9
+
10
+ # wok-server 配置组件
11
+
12
+ ## 概述
13
+
14
+ 配置组件将配置对象与环境变量映射,并提供给其他模块使用。结合校验组件可实现配置的合法性校验。
15
+
16
+ 配置对象的属性仅支持三种类型:`string`、`number`、`boolean`。
17
+
18
+ 提供三个函数:`registerConfig`、`getConfig`、`generateConfig`。
19
+
20
+ ## 源码与类型定义
21
+
22
+ 安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
23
+
24
+ - 源码目录:`node_modules/wok-server/src/config/`
25
+ - 类型定义:`node_modules/wok-server/types/` (引用 config 组件的 `.d.ts` 文件)
26
+
27
+ 核心源码文件:
28
+
29
+ | 文件 | 说明 |
30
+ | :-------------- | :--------------------------------- |
31
+ | `index.ts` | 模块入口,导出三个配置函数 |
32
+ | `convert.ts` | 环境变量值类型转换逻辑 |
33
+ | `exception.ts` | `ConfigException` 异常类 |
34
+
35
+ ---
36
+
37
+ ## 配置类型与映射规则
38
+
39
+ ### 类型要求
40
+
41
+ > **⚠️ 重要:配置类型的所有属性绝对不可为空(不能是 `undefined`)。**
42
+
43
+ 配置组件在**运行时**通过 `for...in` 遍历 `defaultConfig` 的属性来匹配环境变量,如果某个属性的值为 `undefined`,该属性的类型将无法判断(`typeof undefined` 为 `"undefined"`),导致 `convert` 抛出 `ConfigException`。
44
+
45
+ 以下写法在真实开发中是不允许的,非常容易出现 bug:
46
+
47
+ ```ts
48
+ // ❌ 错误:属性可空
49
+ interface XxxConfig {
50
+ name?: string
51
+ }
52
+ // 如果 defaultConfig 初始化时 name 的值为 undefined,运行时匹配会失败
53
+ ```
54
+
55
+ 正确做法是所有属性保持必填并给出有意义的默认值:
56
+
57
+ ```ts
58
+ // ✅ 正确:属性必填,必须有默认值
59
+ interface XxxConfig {
60
+ name: string
61
+ }
62
+ ```
63
+
64
+ 配置对象的属性仅支持三种类型:
65
+
66
+ | TypeScript 类型 | 环境变量值转换方式 |
67
+ | :-------------- | :--------------------------------------- |
68
+ | `string` | 直接使用字符串值 |
69
+ | `number` | 通过 `parseFloat` 转换,NaN 则抛异常 |
70
+ | `boolean` | `'true'` → true, `'false'` → false,其他抛异常 |
71
+
72
+ ### 环境变量名映射
73
+
74
+ 环境变量名 = `前缀(大写)_属性名转换(大写)`。属性名中的大写字母前会插入下划线。
75
+
76
+ 例如:前缀 `custom`,属性 `appId` → 环境变量 `CUSTOM_APP_ID`。
77
+
78
+ 每次调用 `registerConfig` 或 `generateConfig` 都会输出日志,包含前缀、环境变量名、当前值、映射属性名,便于调试。
79
+
80
+ ---
81
+
82
+ ## registerConfig — 注册配置(推荐)
83
+
84
+ ```ts
85
+ function registerConfig<T extends {}>(
86
+ defaultConfig: T,
87
+ envPrefix: string,
88
+ validation?: ValidationOpts<T>
89
+ ): T
90
+ ```
91
+
92
+ - `defaultConfig`:默认配置对象,**所有属性必须有值(不能为 `undefined`)**。运行时通过遍历该对象的属性来匹配环境变量,属性值为 `undefined` 会导致类型无法识别而抛出异常
93
+ - `envPrefix`:环境变量前缀
94
+ - `validation`:可选的校验规则
95
+ - 返回映射后的配置对象
96
+
97
+ **特点**:同一前缀只能注册一次,重复注册会抛出 `ConfigException`。推荐将返回的配置对象导出供其他模块使用。
98
+
99
+ ```ts
100
+ import { registerConfig, notBlank, notNull, min, max } from 'wok-server'
101
+
102
+ interface CustomConfig {
103
+ appId: string
104
+ appSecret: string
105
+ ssl: boolean
106
+ timeout: number
107
+ }
108
+
109
+ const config = registerConfig<CustomConfig>(
110
+ { appId: '', appSecret: '', ssl: true, timeout: 5000 },
111
+ 'custom',
112
+ {
113
+ appId: [notBlank()],
114
+ appSecret: [notBlank()],
115
+ timeout: [notNull(), min(1000), max(3600)]
116
+ }
117
+ )
118
+ ```
119
+
120
+ 也可以不显式定义类型,让 TypeScript 自动推断:
121
+
122
+ ```ts
123
+ const config = registerConfig(
124
+ { url: 'http://localhost/api', account: 'Jack' },
125
+ 'c2',
126
+ { url: [notBlank()] }
127
+ )
128
+ ```
129
+
130
+ ---
131
+
132
+ ## generateConfig — 生成配置(可重复)
133
+
134
+ ```ts
135
+ function generateConfig<T extends {}>(
136
+ defaultConfig: T,
137
+ envPrefix: string,
138
+ validation?: ValidationOpts<T>
139
+ ): T
140
+ ```
141
+
142
+ 参数与 `registerConfig` 完全一致。区别在于 `generateConfig` **不注册**,可多次调用,适合以下场景:
143
+ - 运行时更改环境变量后重新生成配置
144
+ - 测试中模拟不同环境
145
+ - 其他需要动态生成配置的特殊需求
146
+
147
+ ```ts
148
+ const config1 = generateConfig(defaults, 'myapp')
149
+ // 修改环境变量后
150
+ process.env.MYAPP_TIMEOUT = '8000'
151
+ const config2 = generateConfig(defaults, 'myapp')
152
+ ```
153
+
154
+ ---
155
+
156
+ ## getConfig — 获取已注册配置
157
+
158
+ ```ts
159
+ function getConfig<T>(envPrefix: string): T | undefined
160
+ ```
161
+
162
+ 通过前缀获取已注册的配置对象。一般不需要使用,推荐在 `registerConfig` 调用后直接导出返回的配置对象。
163
+
164
+ ```ts
165
+ const config = getConfig<CustomConfig>('custom')
166
+ ```
167
+
168
+ ---
169
+
170
+ ## 内部实现要点
171
+
172
+ ### 类型转换 (`convert.ts`)
173
+
174
+ ```ts
175
+ function convert(val: string, defaultVal: any): string | number | boolean
176
+ ```
177
+
178
+ - 根据 `defaultVal` 的类型决定转换策略
179
+ - `string`:直接返回原值
180
+ - `number`:`parseFloat` 转换,失败抛出 `ConfigException`
181
+ - `boolean`:仅接受 `'true'` / `'false'`,大小写敏感
182
+ - 其他类型不支持,抛出 `ConfigException`
183
+
184
+ ### 环境变量名构建
185
+
186
+ ```ts
187
+ function buildEnvName(envPrefix: string, propName: string): string
188
+ ```
189
+
190
+ 将驼峰属性名转换为下划线大写格式:
191
+ - `appId` → `APP_ID`
192
+ - 前缀 `custom` + `appId` → `CUSTOM_APP_ID`
193
+
194
+ ### 全局注册表
195
+
196
+ `registerConfig` 内部维护一个 `configEnvMap`(`Map<string, any>`),以前缀为 key 存储配置。重复注册相同前缀直接抛异常,保证配置唯一性。
197
+
198
+ ### 模块初始化
199
+
200
+ 模块顶层调用 `dotenv` 的 `config()` 加载 `.env` 文件,确保环境变量在配置映射前已就绪。
@@ -0,0 +1,123 @@
1
+ ---
2
+ name: wok-server-getting-started
3
+ description: 介绍 wok-server 的入门指南,包括项目创建、手动安装、最简使用、使用路由等。
4
+ license: MIT
5
+ metadata:
6
+ author: Peak Tai
7
+ email: peaktai@qq.com
8
+ ---
9
+
10
+ # wok-server 入门指南
11
+
12
+ wok-server 是一个简洁易用的 Node.js 后端开发框架,使用 TypeScript 开发,有完整的类型约束和定义,注释详细,文档齐全,支持国际化。
13
+
14
+ 主要功能:配置,日志,国际化,校验,缓存,MVC,MySQL,MongoDB,周期任务。
15
+
16
+ ## 创建项目
17
+
18
+ 推荐通过脚手架创建一个结构完整的项目:
19
+
20
+ ```bash
21
+ npm create wok-server
22
+ ```
23
+
24
+ 创建的项目结构与[工程化文档](./references/engineering.md)推荐的目录结构一致(按功能划分,而非传统的按层划分),细节可参考该文档。
25
+
26
+ ## 手动安装
27
+
28
+ ```bash
29
+ npm i wok-server --save
30
+ ```
31
+
32
+ ## 最简示例
33
+
34
+ 入口文件 `main.ts`:
35
+
36
+ ```ts
37
+ import { startWebServer } from 'wok-server'
38
+
39
+ startWebServer({
40
+ routers: {
41
+ '/': async exchange => exchange.respondText('Hello world !')
42
+ }
43
+ }).catch(e => {
44
+ console.error('Start server failed', e)
45
+ })
46
+ ```
47
+
48
+ 运行后访问 `http://localhost:8080` 将输出 "Hello world !"。
49
+
50
+ 相关设置可通过环境变量来修改,比如 `SERVER_PORT` 设置端口号。
51
+
52
+ ## 路由与拦截器
53
+
54
+ ```ts
55
+ import { startWebServer } from 'wok-server'
56
+
57
+ await startWebServer({
58
+ routers: {
59
+ '/': async exchange => exchange.respondJson({ ok: true }),
60
+ '/users': async exchange => {
61
+ const list = await listUser()
62
+ exchange.respondJson(list)
63
+ }
64
+ },
65
+ interceptors: [
66
+ async (exchange, next) => {
67
+ try {
68
+ await next()
69
+ } catch (e) {
70
+ exchange.respondErrMsg('服务器错误', 500)
71
+ }
72
+ }
73
+ ]
74
+ })
75
+ ```
76
+
77
+ ## JSON 请求处理
78
+
79
+ 使用 `createJsonHandler` 快速创建 JSON 格式接口,自动完成请求解析、校验、响应序列化:
80
+
81
+ ```ts
82
+ import { createJsonHandler, notBlank, length } from 'wok-server'
83
+
84
+ interface Form {
85
+ code: string
86
+ nickname: string
87
+ }
88
+
89
+ export const createUser = createJsonHandler<Form, { id: string }>({
90
+ validation: {
91
+ code: [notBlank(), length({ max: 64 })],
92
+ nickname: [notBlank(), length({ max: 64 })]
93
+ },
94
+ async handle(body) {
95
+ const newUser = await createUserInDb(body)
96
+ return { id: newUser.id }
97
+ }
98
+ })
99
+ ```
100
+
101
+ ## 数据库操作(MySQL 为例)
102
+
103
+ ```ts
104
+ import { enableMysql, getMysqlManager, Table } from 'wok-server'
105
+
106
+ await enableMysql()
107
+
108
+ export interface User {
109
+ id: string
110
+ nickname: string
111
+ }
112
+
113
+ export const tableUser: Table<User> = {
114
+ tableName: 'user',
115
+ id: 'id',
116
+ columns: ['nickname']
117
+ }
118
+
119
+ const manager = getMysqlManager()
120
+ const user = await manager.findById(tableUser, '001')
121
+ ```
122
+
123
+ 数据库组件也支持 MongoDB,用法类似。
@@ -0,0 +1,169 @@
1
+ # 工程化实践
2
+
3
+ 当程序规模变大后,需要对代码文件进行合理组织。
4
+
5
+ ## 目录结构
6
+
7
+ 推荐按功能划分目录,而非传统的按层(service 层、controller 层)划分,这样相关性高的文件放在一起,查找更方便,也更利于封装。
8
+
9
+ 假设有用户(user)和标签(tag)两个业务功能,项目大致结构如下:
10
+
11
+ ```
12
+ 根目录
13
+ ├── db_migration/ # MySQL 数据库迁移文件
14
+ ├── src/
15
+ │ ├── auth/ # 授权业务
16
+ │ │ ├── auth.ts # 实体配置
17
+ │ │ ├── auth-interceptor.ts # 授权拦截器
18
+ │ │ ├── create-auth.ts # 创建授权接口
19
+ │ │ ├── ccu-task.ts # 在线人数统计任务
20
+ │ │ └── index.ts # 包入口,导出模块
21
+ │ ├── user/ # 用户业务
22
+ │ │ ├── user.ts # 实体配置
23
+ │ │ ├── create-user.ts # 创建用户接口
24
+ │ │ ├── delete-user.ts # 删除用户接口
25
+ │ │ ├── update-user.ts # 更新用户接口
26
+ │ │ └── index.ts
27
+ │ ├── tag/ # 标签业务
28
+ │ │ ├── tag.ts # 实体配置
29
+ │ │ ├── create-tag.ts # 创建标签接口
30
+ │ │ ├── delete-tag.ts # 删除标签接口
31
+ │ │ └── index.ts
32
+ │ ├── exception.ts # 全局异常与异常拦截器
33
+ │ ├── router.ts # 全局路由配置,规模较大的项目,需要将路由配置单独放到一个文件中,或者创建一个单独的目录
34
+ │ └── main.ts # 入口文件,启动服务,配置路由
35
+ ├── .env # 开发环境变量配置
36
+ ├── package.json
37
+ └── tsconfig.json
38
+ ```
39
+
40
+ ## 核心原则
41
+
42
+ 1. **按功能划分目录**,相关性高的文件放在一起
43
+ 2. **每个接口单独一个文件**,仅导出处理函数
44
+ 3. **路由配置集中管理**,不可分散到各业务目录
45
+ 4. **通过异常中断处理流程**,由拦截器统一响应
46
+
47
+ ## 异常处理
48
+
49
+ 定义业务异常,在流程无法继续时抛出,由拦截器统一处理:
50
+
51
+ ```ts
52
+ export class BusinessException {
53
+ constructor(
54
+ readonly message: string,
55
+ readonly status?: number
56
+ ) {}
57
+ }
58
+
59
+ export async function globalErrorInterceptor(
60
+ exchange: ServerExchange,
61
+ next: () => Promise<void>
62
+ ): Promise<void> {
63
+ try {
64
+ await next()
65
+ } catch (e) {
66
+ if (e instanceof BusinessException) {
67
+ exchange.respondErrMsg(e.message, e.status ?? 400)
68
+ return
69
+ }
70
+ if (e instanceof ValidationException) {
71
+ exchange.respondErrMsg(`${e.propertyPath}:${e.errMsg}`, 400)
72
+ return
73
+ }
74
+ throw e // 框架默认响应 500
75
+ }
76
+ }
77
+ ```
78
+
79
+ ## 入口文件示例
80
+
81
+ ```ts
82
+ import { enableMysql, startWebServer, scheduleWithFixedDelay } from 'wok-server'
83
+ import { createAuth, authInterceptor, ccuTask } from './auth'
84
+ import { createUser, updateUser, deleteUser } from './user'
85
+ import { createTag, deleteTag } from './tag'
86
+ import { globalErrorInterceptor } from './exception'
87
+
88
+ async function main() {
89
+ Date.prototype.toJSON = function () {
90
+ return this.getTime() as any
91
+ }
92
+
93
+ await enableMysql()
94
+
95
+ await startWebServer({
96
+ routers: {
97
+ '/auth/create': createAuth,
98
+ '/user/create': createUser,
99
+ '/user/update': updateUser,
100
+ '/user/delete': deleteUser,
101
+ '/tag/create': createTag,
102
+ '/tag/delete': deleteTag
103
+ },
104
+ interceptors: [globalErrorInterceptor, authInterceptor]
105
+ })
106
+
107
+ scheduleWithFixedDelay(60, 60, ccuTask)
108
+ }
109
+
110
+ main().catch(console.error)
111
+ ```
112
+
113
+ ## 实体与接口示例
114
+
115
+ `user/user.ts` — 实体类型与表配置:
116
+
117
+ ```ts
118
+ import { Table } from 'wok-server'
119
+
120
+ export interface User {
121
+ id: string
122
+ code: string
123
+ nickname: string
124
+ pwd: string
125
+ status: 'ACTIVATED' | 'DISABLED'
126
+ create_at?: Date
127
+ update_at?: Date
128
+ }
129
+
130
+ export const tableUser: Table<User> = {
131
+ tableName: 'user',
132
+ id: 'id',
133
+ columns: ['code', 'nickname', 'pwd', 'status'],
134
+ createdDate: { type: 'date', column: 'create_at' },
135
+ updatedDate: { type: 'date', column: 'update_at' }
136
+ }
137
+ ```
138
+
139
+ `user/create-user.ts` — 接口处理:
140
+
141
+ ```ts
142
+ import { createJsonHandler, getMysqlManager, notBlank, length } from 'wok-server'
143
+ import { tableUser } from './user'
144
+
145
+ interface Form {
146
+ code: string
147
+ nickname: string
148
+ pwd: string
149
+ }
150
+ interface Resp {
151
+ id: string
152
+ }
153
+
154
+ export const createUser = createJsonHandler<Form, Resp>({
155
+ validation: {
156
+ code: [notBlank(), length({ max: 64 })],
157
+ nickname: [notBlank(), length({ max: 64 })],
158
+ pwd: [notBlank(), length({ max: 20 })]
159
+ },
160
+ async handle(body) {
161
+ const manager = getMysqlManager()
162
+ if (await manager.existsBy(tableUser, { code: body.code })) {
163
+ throw new BusinessException('编号已存在')
164
+ }
165
+ const newUser = await manager.insert(tableUser, body)
166
+ return { id: newUser.id }
167
+ }
168
+ })
169
+ ```