wok-server 0.4.13 → 0.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.
Files changed (376) 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 -29
  31. package/dist/log/date.js +21 -21
  32. package/dist/log/file.js +198 -72
  33. package/dist/log/index.js +135 -105
  34. package/dist/log/level.js +33 -33
  35. package/dist/log/log.js +56 -0
  36. package/dist/log/store.js +19 -16
  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 +239 -231
  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 +356 -356
  80. package/dist/mysql/manager/ops/delete.js +65 -65
  81. package/dist/mysql/manager/ops/exist.js +26 -26
  82. package/dist/mysql/manager/ops/find.js +169 -130
  83. package/dist/mysql/manager/ops/index.js +14 -14
  84. package/dist/mysql/manager/ops/insert.js +106 -106
  85. package/dist/mysql/manager/ops/modify.js +10 -10
  86. package/dist/mysql/manager/ops/paginate.js +23 -23
  87. package/dist/mysql/manager/ops/query.js +9 -9
  88. package/dist/mysql/manager/ops/update.js +216 -216
  89. package/dist/mysql/manager/ops/utils.js +24 -24
  90. package/dist/mysql/manager/tx-strict.js +103 -100
  91. package/dist/mysql/manager/tx.js +30 -30
  92. package/dist/mysql/manager/utils.js +56 -56
  93. package/dist/mysql/migration.js +136 -136
  94. package/dist/mysql/table-info.js +8 -8
  95. package/dist/task/daily.js +59 -59
  96. package/dist/task/fixed-delay.js +38 -38
  97. package/dist/task/fixed-rate.js +42 -42
  98. package/dist/task/index.js +9 -9
  99. package/dist/task/task.js +56 -56
  100. package/dist/validation/exception.js +36 -36
  101. package/dist/validation/index.js +40 -40
  102. package/dist/validation/validator/array.js +34 -34
  103. package/dist/validation/validator/enum.js +28 -28
  104. package/dist/validation/validator/index.js +14 -14
  105. package/dist/validation/validator/length.js +40 -40
  106. package/dist/validation/validator/max-length.js +35 -35
  107. package/dist/validation/validator/max.js +29 -29
  108. package/dist/validation/validator/min-length.js +33 -33
  109. package/dist/validation/validator/min.js +29 -29
  110. package/dist/validation/validator/not-blank.js +33 -33
  111. package/dist/validation/validator/not-null.js +21 -21
  112. package/dist/validation/validator/plain-obj.js +32 -32
  113. package/dist/validation/validator/regexp.js +34 -34
  114. package/documentation/en/cache.md +56 -0
  115. package/documentation/en/config.md +96 -0
  116. package/documentation/en/engineering.md +256 -0
  117. package/documentation/en/http-client.md +32 -0
  118. package/documentation/en/i18n.md +143 -0
  119. package/documentation/en/index.md +24 -0
  120. package/documentation/en/lock.md +51 -0
  121. package/documentation/en/log.md +109 -0
  122. package/documentation/en/mongodb.md +256 -0
  123. package/documentation/en/mvc.md +688 -0
  124. package/documentation/en/mysql.md +552 -0
  125. package/documentation/en/task.md +45 -0
  126. package/documentation/en/test.md +56 -0
  127. package/documentation/en/validate.md +130 -0
  128. package/documentation/zh-cn/engineering.md +1 -1
  129. package/documentation/zh-cn/log.md +81 -8
  130. package/documentation/zh-cn/mvc.md +66 -24
  131. package/documentation/zh-cn/mysql.md +24 -23
  132. package/documentation/zh-cn/validate.md +2 -2
  133. package/package.json +3 -1
  134. package/skills/wok-server-api-rules/SKILL.md +350 -0
  135. package/skills/wok-server-cache/SKILL.md +216 -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 +315 -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 +285 -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 +412 -0
  232. package/src/mysql/manager/ops/delete.ts +96 -0
  233. package/src/mysql/manager/ops/exist.ts +41 -0
  234. package/src/mysql/manager/ops/find.ts +226 -0
  235. package/src/mysql/manager/ops/index.ts +11 -0
  236. package/src/mysql/manager/ops/insert.ts +120 -0
  237. package/src/mysql/manager/ops/modify.ts +14 -0
  238. package/src/mysql/manager/ops/paginate.ts +60 -0
  239. package/src/mysql/manager/ops/query.ts +13 -0
  240. package/src/mysql/manager/ops/update.ts +294 -0
  241. package/src/mysql/manager/ops/utils.ts +20 -0
  242. package/src/mysql/manager/tx-strict.ts +138 -0
  243. package/src/mysql/manager/tx.ts +31 -0
  244. package/src/mysql/manager/utils.ts +75 -0
  245. package/src/mysql/migration.ts +149 -0
  246. package/src/mysql/table-info.ts +41 -0
  247. package/src/task/daily.ts +70 -0
  248. package/src/task/fixed-delay.ts +45 -0
  249. package/src/task/fixed-rate.ts +49 -0
  250. package/src/task/index.ts +4 -0
  251. package/src/task/task.ts +70 -0
  252. package/src/validation/exception.ts +27 -0
  253. package/src/validation/index.ts +61 -0
  254. package/src/validation/validator/array.ts +32 -0
  255. package/src/validation/validator/enum.ts +25 -0
  256. package/src/validation/validator/index.ts +11 -0
  257. package/src/validation/validator/length.ts +42 -0
  258. package/src/validation/validator/max-length.ts +33 -0
  259. package/src/validation/validator/max.ts +26 -0
  260. package/src/validation/validator/min-length.ts +31 -0
  261. package/src/validation/validator/min.ts +26 -0
  262. package/src/validation/validator/not-blank.ts +31 -0
  263. package/src/validation/validator/not-null.ts +19 -0
  264. package/src/validation/validator/plain-obj.ts +30 -0
  265. package/src/validation/validator/regexp.ts +32 -0
  266. package/types/cache/cache.d.ts +52 -52
  267. package/types/cache/config.d.ts +32 -32
  268. package/types/cache/index.d.ts +2 -2
  269. package/types/cache/purge-task.d.ts +11 -11
  270. package/types/cache/stat.d.ts +26 -26
  271. package/types/config/convert.d.ts +6 -6
  272. package/types/config/exception.d.ts +7 -7
  273. package/types/config/index.d.ts +25 -25
  274. package/types/http-client/index.d.ts +71 -71
  275. package/types/i18n/ar.d.ts +2 -2
  276. package/types/i18n/de.d.ts +2 -2
  277. package/types/i18n/en-us.d.ts +2 -2
  278. package/types/i18n/es.d.ts +2 -2
  279. package/types/i18n/fr.d.ts +2 -2
  280. package/types/i18n/i18n.d.ts +102 -102
  281. package/types/i18n/index.d.ts +9 -9
  282. package/types/i18n/ja.d.ts +2 -2
  283. package/types/i18n/ko.d.ts +2 -2
  284. package/types/i18n/msg.d.ts +50 -50
  285. package/types/i18n/pt.d.ts +2 -2
  286. package/types/i18n/ru.d.ts +2 -2
  287. package/types/i18n/tag.d.ts +11 -11
  288. package/types/i18n/zh-HK.d.ts +2 -2
  289. package/types/i18n/zh-TW.d.ts +2 -2
  290. package/types/i18n/zh-cn.d.ts +2 -2
  291. package/types/index.d.ts +11 -11
  292. package/types/lock/index.d.ts +64 -64
  293. package/types/log/config.d.ts +35 -27
  294. package/types/log/date.d.ts +2 -2
  295. package/types/log/file.d.ts +13 -5
  296. package/types/log/index.d.ts +53 -34
  297. package/types/log/level.d.ts +14 -14
  298. package/types/log/log.d.ts +40 -0
  299. package/types/log/store.d.ts +19 -12
  300. package/types/mongodb/collection.d.ts +25 -25
  301. package/types/mongodb/config.d.ts +45 -45
  302. package/types/mongodb/doc.d.ts +11 -11
  303. package/types/mongodb/exception.d.ts +7 -7
  304. package/types/mongodb/index.d.ts +29 -29
  305. package/types/mongodb/manager/base.d.ts +188 -188
  306. package/types/mongodb/manager/index.d.ts +38 -38
  307. package/types/mongodb/manager/tx-strict.d.ts +41 -41
  308. package/types/mongodb/manager/tx.d.ts +21 -21
  309. package/types/mongodb/migration.d.ts +12 -12
  310. package/types/mvc/access-log.d.ts +7 -7
  311. package/types/mvc/config.d.ts +42 -42
  312. package/types/mvc/exchange.d.ts +72 -72
  313. package/types/mvc/handler/index.d.ts +4 -3
  314. package/types/mvc/handler/json.d.ts +44 -44
  315. package/types/mvc/handler/restful.d.ts +11 -11
  316. package/types/mvc/handler/sse.d.ts +34 -0
  317. package/types/mvc/handler/upload.d.ts +36 -36
  318. package/types/mvc/index.d.ts +22 -22
  319. package/types/mvc/interceptor.d.ts +11 -11
  320. package/types/mvc/query.d.ts +13 -13
  321. package/types/mvc/render/file.d.ts +10 -10
  322. package/types/mvc/render/html/html.d.ts +98 -98
  323. package/types/mvc/render/html/index.d.ts +11 -11
  324. package/types/mvc/render/html/style.d.ts +1201 -1201
  325. package/types/mvc/render/index.d.ts +4 -4
  326. package/types/mvc/render/json.d.ts +17 -17
  327. package/types/mvc/render/text.d.ts +10 -10
  328. package/types/mvc/router.d.ts +11 -11
  329. package/types/mvc/server.d.ts +90 -90
  330. package/types/mvc/static/header.d.ts +27 -27
  331. package/types/mvc/static/index.d.ts +3 -3
  332. package/types/mvc/static/mime-type.d.ts +2 -2
  333. package/types/mvc/static/server-cache-config.d.ts +30 -30
  334. package/types/mvc/static/server-cache.d.ts +76 -76
  335. package/types/mvc/static/static-handler.d.ts +77 -77
  336. package/types/mysql/config.d.ts +90 -90
  337. package/types/mysql/exception.d.ts +7 -7
  338. package/types/mysql/index.d.ts +16 -16
  339. package/types/mysql/manager/base.d.ts +165 -159
  340. package/types/mysql/manager/index.d.ts +36 -36
  341. package/types/mysql/manager/ops/count.d.ts +13 -13
  342. package/types/mysql/manager/ops/criteria.d.ts +134 -134
  343. package/types/mysql/manager/ops/delete.d.ts +46 -46
  344. package/types/mysql/manager/ops/exist.d.ts +6 -6
  345. package/types/mysql/manager/ops/find.d.ts +86 -70
  346. package/types/mysql/manager/ops/index.d.ts +10 -10
  347. package/types/mysql/manager/ops/insert.d.ts +18 -18
  348. package/types/mysql/manager/ops/modify.d.ts +3 -3
  349. package/types/mysql/manager/ops/paginate.d.ts +36 -36
  350. package/types/mysql/manager/ops/query.d.ts +3 -3
  351. package/types/mysql/manager/ops/update.d.ts +76 -76
  352. package/types/mysql/manager/ops/utils.d.ts +5 -5
  353. package/types/mysql/manager/tx-strict.d.ts +36 -35
  354. package/types/mysql/manager/tx.d.ts +15 -15
  355. package/types/mysql/manager/utils.d.ts +17 -17
  356. package/types/mysql/migration.d.ts +8 -8
  357. package/types/mysql/table-info.d.ts +36 -36
  358. package/types/task/daily.d.ts +16 -16
  359. package/types/task/fixed-delay.d.ts +9 -9
  360. package/types/task/fixed-rate.d.ts +9 -9
  361. package/types/task/index.d.ts +4 -4
  362. package/types/task/task.d.ts +34 -34
  363. package/types/validation/exception.d.ts +38 -38
  364. package/types/validation/index.d.ts +32 -32
  365. package/types/validation/validator/array.d.ts +5 -5
  366. package/types/validation/validator/enum.d.ts +8 -8
  367. package/types/validation/validator/index.d.ts +11 -11
  368. package/types/validation/validator/length.d.ts +10 -10
  369. package/types/validation/validator/max-length.d.ts +8 -8
  370. package/types/validation/validator/max.d.ts +7 -7
  371. package/types/validation/validator/min-length.d.ts +6 -6
  372. package/types/validation/validator/min.d.ts +7 -7
  373. package/types/validation/validator/not-blank.d.ts +7 -7
  374. package/types/validation/validator/not-null.d.ts +6 -6
  375. package/types/validation/validator/plain-obj.d.ts +7 -7
  376. package/types/validation/validator/regexp.d.ts +8 -8
@@ -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
+ ```
@@ -0,0 +1,164 @@
1
+ ---
2
+ name: wok-server-http-client
3
+ description: wok-server HTTP 客户端组件使用指南,基于 Node.js 内置 http/https 模块封装的请求工具。
4
+ license: MIT
5
+ metadata:
6
+ author: Peak Tai
7
+ email: peaktai@qq.com
8
+ ---
9
+
10
+ # wok-server HTTP 客户端
11
+
12
+ ## 概述
13
+
14
+ HTTP 客户端基于 Node.js 内置 `http` 和 `https` 模块封装,提供三个函数:`doRequest`(通用请求)、`postJson`(JSON 响应 POST)、`getJson`(JSON 响应 GET)。支持自动 HTTPS、重定向跟随、超时控制。
15
+
16
+ ## 源码与类型定义
17
+
18
+ 安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
19
+
20
+ - 源码目录:`node_modules/wok-server/src/http-client/`
21
+ - 类型定义:`node_modules/wok-server/types/` (引用 http-client 组件的 `.d.ts` 文件)
22
+
23
+ 核心源码文件:
24
+
25
+ | 文件 | 说明 |
26
+ | :-------------- | :--------------------------------- |
27
+ | `index.ts` | `doRequest`、`postJson`、`getJson` |
28
+
29
+ ---
30
+
31
+ ## 三个函数
32
+
33
+ | 函数 | 作用 |
34
+ | :---------- | :------------------------------------- |
35
+ | `doRequest` | 通用 HTTP 请求,自定义所有选项 |
36
+ | `postJson` | POST 请求 + JSON 响应,自动序列化 body |
37
+ | `getJson` | GET 请求 + JSON 响应,默认跟随重定向 |
38
+
39
+ ---
40
+
41
+ ## getJson — GET JSON 请求
42
+
43
+ ```ts
44
+ function getJson<T>(
45
+ opts: { url: string; query?: Record<string, string[] | string>; headers?: IncomingHttpHeaders; timeout?: number }
46
+ ): Promise<T>
47
+ ```
48
+
49
+ - 自动跟随重定向(`followRedirect: true`)
50
+ - 状态码非 200 抛异常(含响应体前 1024 字节)
51
+ - 空响应体返回 `{}`
52
+
53
+ ```ts
54
+ import { getJson } from 'wok-server'
55
+
56
+ const list = await getJson<User[]>({
57
+ url: 'https://api.example.com/users',
58
+ query: { status: 'active' },
59
+ headers: { 'Authorization': 'Bearer xxx' },
60
+ timeout: 3000
61
+ })
62
+ ```
63
+
64
+ ---
65
+
66
+ ## postJson — POST JSON 请求
67
+
68
+ ```ts
69
+ function postJson<T>(
70
+ opts: { url: string; body: any; query?: Record<string, string[] | string>; headers?: IncomingHttpHeaders; timeout?: number }
71
+ ): Promise<T>
72
+ ```
73
+
74
+ - 自动设置 `Content-Type: application/json; charset=utf-8`
75
+ - 自动将 `body` 序列化为 JSON 字符串
76
+ - 不跟随重定向(`followRedirect: false`)
77
+ - 状态码非 200 抛异常
78
+
79
+ ```ts
80
+ import { postJson } from 'wok-server'
81
+
82
+ const res = await postJson<{ id: string }>({
83
+ url: 'https://api.example.com/users',
84
+ body: { name: 'jack', age: 33 },
85
+ timeout: 5000
86
+ })
87
+ ```
88
+
89
+ ---
90
+
91
+ ## doRequest — 通用请求
92
+
93
+ ```ts
94
+ function doRequest(opts: HttpRequestOpts): Promise<HttpResponseInfo>
95
+ ```
96
+
97
+ 完整选项:
98
+
99
+ | 选项 | 类型 | 说明 |
100
+ | :--------------- | :------------------------------------------------ | :------------------------------------- |
101
+ | `url` | `string` | 请求地址(支持 `http://` 和 `https://`) |
102
+ | `method` | `GET \| POST \| PUT \| DELETE \| ...` | 请求方法 |
103
+ | `body` | `string \| Buffer` | 请求正文(可选) |
104
+ | `query` | `Record<string, string \| string[]>` | 查询参数,自动拼接 URL(可选) |
105
+ | `headers` | `IncomingHttpHeaders` | 自定义消息头(可选) |
106
+ | `timeout` | `number` | 超时时间(ms),默认 5000 |
107
+ | `followRedirect` | `boolean` | 是否跟随重定向(301/302/303/307/308) |
108
+
109
+ 返回值 `HttpResponseInfo`:
110
+
111
+ ```ts
112
+ interface HttpResponseInfo {
113
+ status: number
114
+ headers: IncomingHttpHeaders
115
+ body: Buffer
116
+ }
117
+ ```
118
+
119
+ 示例:
120
+
121
+ ```ts
122
+ import { doRequest } from 'wok-server'
123
+
124
+ // DELETE 请求
125
+ const res = await doRequest({
126
+ url: 'https://api.example.com/users/001',
127
+ method: 'DELETE',
128
+ timeout: 5000
129
+ })
130
+
131
+ // 带查询参数
132
+ const res2 = await doRequest({
133
+ url: 'https://api.example.com/search',
134
+ method: 'GET',
135
+ query: { keyword: 'test', tags: ['a', 'b'] }
136
+ })
137
+
138
+ // 跟随重定向
139
+ const res3 = await doRequest({
140
+ url: 'https://short.link/abc',
141
+ method: 'GET',
142
+ followRedirect: true
143
+ })
144
+ ```
145
+
146
+ ---
147
+
148
+ ## 内部实现要点
149
+
150
+ ### URL 解析
151
+
152
+ 使用 Node.js 内置 `URL` 类解析,根据 `protocol` 自动选择 `http.request` 或 `https.request`。`query` 通过 `url.searchParams.append` 拼接(支持 `string` 和 `string[]`)。
153
+
154
+ ### 重定向
155
+
156
+ `doRequest` 中检测 301/302/303/307/308 状态码时,取 `location` 头作为新 URL 递归调用。递归只进行一次(二次请求强制 `followRedirect: false`),防止死循环。
157
+
158
+ ### 超时
159
+
160
+ 通过 `req.on('timeout', ...)` 处理超时,timeout 默认为 5000ms。也可以传入自定义值,`<=0` 视为无效使用默认值。
161
+
162
+ ### HTTPS
163
+
164
+ `rejectUnauthorized: false`,不验证服务端证书,适用于自签名证书场景。