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,388 @@
1
+ ---
2
+ name: wok-server-mysql
3
+ description: wok-server MySQL 组件使用指南,提供单表 CRUD、多数据源、版本管理和事务的完整支持。
4
+ license: MIT
5
+ metadata:
6
+ author: Peak Tai
7
+ email: peaktai@qq.com
8
+ ---
9
+
10
+ # wok-server MySQL 组件
11
+
12
+ ## 概述
13
+
14
+ MySQL 组件基于 [mysql2](https://www.npmjs.com/package/mysql2) 封装,提供便捷的单表操作。支持:实体映射 CRUD、多数据源、SQL 版本管理、事务、慢查询告警。
15
+
16
+ ## 源码与类型定义
17
+
18
+ 安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
19
+
20
+ - 源码目录:`node_modules/wok-server/src/mysql/`
21
+ - 类型定义:`node_modules/wok-server/types/` (引用 mysql 组件的 `.d.ts` 文件)
22
+
23
+ 核心源码文件:
24
+
25
+ | 文件 | 说明 |
26
+ | :----------------- | :--------------------------------- |
27
+ | `index.ts` | 模块入口,`enableMysql`/`getMysqlManager` |
28
+ | `config.ts` | 配置定义与默认值 |
29
+ | `table-info.ts` | `Table<T>` 表映射接口 |
30
+ | `manager/` | 管理器层:`BaseMysqlManager`、`MysqlManager`、`MysqlTxSession` |
31
+ | `manager/ops/` | 各操作的 SQL 生成与执行 |
32
+ | `manager/ops/criteria.ts` | `MysqlCriteria` 条件构建器 |
33
+ | `migration.ts` | SQL 文件版本管理 |
34
+ | `exception.ts` | `MysqlException` 异常类 |
35
+
36
+ ---
37
+
38
+ ## 环境变量
39
+
40
+ | 环境变量 | 说明 | 默认值 |
41
+ | :----------------------------- | :------------------- | :----------- |
42
+ | `MYSQL_HOST` | 主机名 | localhost |
43
+ | `MYSQL_PORT` | 端口号 | 3306 |
44
+ | `MYSQL_USER` | 用户名 | root |
45
+ | `MYSQL_PASSWORD` | 密码 | 123456 |
46
+ | `MYSQL_DATABASE` | 数据库名 | example |
47
+ | `MYSQL_CHARSET` | 字符集 | utf8mb4 |
48
+ | `MYSQL_CONNECTION_LIMIT` | 最大连接数 | 10 |
49
+ | `MYSQL_MAX_IDLE` | 最大闲置连接数 | 10 |
50
+ | `MYSQL_IDLE_TIMEOUT` | 闲置超时(ms) | 60000 |
51
+ | `MYSQL_CONNECT_TIMEOUT` | 连接超时(ms) | 10000 |
52
+ | `MYSQL_DEBUG` | 调试模式,输出 SQL | false |
53
+ | `MYSQL_SLOW_SQL_WARN` | 慢查询警告 | true |
54
+ | `MYSQL_SLOW_SQL_MS` | 慢查询阈值(ms) | 200 |
55
+ | `MYSQL_TIMEZONE` | 时区 | +08:00 |
56
+ | `MYSQL_VERSION_CONTROL_ENABLED`| 版本管理开启 | false |
57
+ | `MYSQL_VERSION_CONTROL_DIR` | 迁移文件目录 | db_migration |
58
+ | `MYSQL_TRANSACTION_TIMEOUT` | 事务超时(ms) | 5000 |
59
+ | `MYSQL_TRANSACTION_STRICT` | 事务严格模式 | true |
60
+ | `MYSQL_MAX_OPS_IN_STRICT_TX` | 严格事务最大操作次数 | 10 |
61
+
62
+ ---
63
+
64
+ ## 初始化
65
+
66
+ ```ts
67
+ import { enableMysql, getMysqlManager } from 'wok-server'
68
+
69
+ await enableMysql()
70
+ const manager = getMysqlManager()
71
+ ```
72
+
73
+ 多数据源(如读写分离等高级用法)见[参考文档](./references/multi-datasource.md)。
74
+
75
+ ---
76
+
77
+ ## 实体类配置
78
+
79
+ 表映射配置由 `Table<T>` 接口定义,字段分三部分:主键、普通列、时间列,三者不允许重叠。
80
+
81
+ ```ts
82
+ import { Table } from 'wok-server'
83
+
84
+ export interface User {
85
+ id: string
86
+ nickname: string
87
+ hobby?: string
88
+ create_at?: number
89
+ update_at?: number
90
+ }
91
+
92
+ export const tableUser: Table<User> = {
93
+ tableName: 'user',
94
+ id: 'id',
95
+ columns: ['nickname', 'hobby'],
96
+ createdDate: { type: 'number', column: 'create_at' },
97
+ updatedDate: { type: 'number', column: 'update_at' }
98
+ }
99
+ ```
100
+
101
+ `createdDate` 和 `updatedDate` 配置的字段由框架自动管理:`insert`/`insertMany` 时自动填入创建时间和更新时间,`update`/`partialUpdate`/`updateMany` 时自动更新 `updatedDate` 字段。业务代码中不需要手动设置这两个字段的值。
102
+
103
+ > **⚠️ 重要:框架不支持字段名称映射。** 实体类型的字段名必须和数据库列名一模一样。比如数据库列名是 `entry_date`,实体字段不能写为 `entryDate` 或 `entryDate` 再用装饰器映射,必须是 `entry_date: Date`。如果之前用惯了其他 ORM 框架,很容易在这里习惯性写成驼峰而掉坑,务必注意。
104
+
105
+ ### 类型映射规则
106
+
107
+ | JS 类型 | MySQL 字段类型 |
108
+ | :------------- | :------------------------------------------------------------------- |
109
+ | `boolean` | TINYINT |
110
+ | `number` | TINYINT, SMALLINT, INT, MEDIUMINT, YEAR, FLOAT, DOUBLE, BIGINT |
111
+ | `Date` | TIMESTAMP, DATE, DATETIME |
112
+ | `Buffer` | TINYBLOB, MEDIUMBLOB, LONGBLOB, BLOB, BINARY, VARBINARY, BIT |
113
+ | `string` | CHAR, VARCHAR, TINYTEXT, MEDIUMTEXT, LONGTEXT, TEXT, ENUM, SET, DECIMAL, TIME |
114
+ | `object`/`array` | JSON |
115
+
116
+ 实体字段类型必须与数据库列类型匹配对应的 JS 原生类型,否则查询结果会不正确。可空字段在实体中也定义为可选(`?`)。
117
+
118
+ ---
119
+
120
+ ## CRUD 操作
121
+
122
+ 所有操作以 `Table<T>` 为第一个参数。
123
+
124
+ ### 查询
125
+
126
+ ```ts
127
+ const user = await manager.findById(tableUser, '001') // 按 ID 查
128
+ const users = await manager.findByIdIn(tableUser, ['001','002']) // 批量 ID 查
129
+ const list = await manager.findAll(tableUser) // ⚠️ 全表,危险
130
+ ```
131
+
132
+ ### 条件查询
133
+
134
+ 使用 `MysqlCriteria` 构建条件,默认 AND 关系:
135
+
136
+ ```ts
137
+ const user = await manager.findFirst(tableUser, c =>
138
+ c.like('nickname', 'ff0%').gt('balance', 75).lt('balance', 77)
139
+ )
140
+ ```
141
+
142
+ **链式条件方法**:`eq`、`neq`、`gt`、`gte`、`lt`、`lte`、`like`、`notLike`、`between`、`in`、`notIn`、`isNull`、`isNotNull`、`or`、`and`、`expr`。
143
+
144
+ `expr()` 方法支持在 WHERE 子句中插入自定义 SQL 表达式:
145
+
146
+ ```ts
147
+ c => c.like('id', 'critex%').expr('?? * ? > ?', ['balance', 2, 50])
148
+ // SQL: where `id` like 'critex%' and `balance` * 2 > 50
149
+ ```
150
+
151
+ ### 复杂查询
152
+
153
+ ```ts
154
+ const list = await manager.find({
155
+ table: tableUser,
156
+ criteria: c => c.between('balance', 700, 800).like('id', 'find%'),
157
+ offset: 1,
158
+ limit: 10,
159
+ orderBy: [['balance', 'asc']]
160
+ })
161
+
162
+ // 自定义排序表达式
163
+ const list2 = await manager.find({
164
+ table: tableUser,
165
+ criteria: c => c.like('nickname', 'ob%'),
166
+ orderBy: [['expr', '?? * ?', ['balance', 2], 'desc']]
167
+ })
168
+ // SQL: ORDER BY `balance` * 2 desc
169
+ ```
170
+
171
+ ### 分页
172
+
173
+ ```ts
174
+ const page = await manager.paginate({
175
+ table: tableUser,
176
+ criteria: c => c.like('id', 'pg0%'),
177
+ pn: 2, pz: 5,
178
+ orderBy: [['balance', 'asc'], ['id', 'asc']]
179
+ })
180
+ // { total: number, list: T[] }
181
+
182
+ // 指定字段分页查询
183
+ const page2 = await manager.paginateSelect({
184
+ table: tableUser,
185
+ criteria: c => c.like('id', 'pg0%'),
186
+ select: ['id', 'nickname', 'balance'],
187
+ pn: 2, pz: 5
188
+ })
189
+ // { total: number, list: Pick<T, 'id'|'nickname'|'balance'>[] }
190
+ ```
191
+
192
+ ### 插入
193
+
194
+ ```ts
195
+ const newUser = await manager.insert(tableUser, { id: 'in001', nickname: '小明' })
196
+ await manager.insertMany(tableUser, [
197
+ { id: 'im001', nickname: '张飞' },
198
+ { id: 'im002', nickname: '关羽' }
199
+ ])
200
+
201
+ // 插入时使用表达式(InsertValue)
202
+ await manager.insert(tableUser, {
203
+ id: 'in002',
204
+ nickname: '小红',
205
+ balance: ['expr', '?? * ?', ['score', 2]],
206
+ createAt: ['now']
207
+ })
208
+ ```
209
+
210
+ 支持三种表达式:`['now']`(NOW())、`['set', value]`(解决元组冲突)、`['expr', sql, values?]`(自定义 SQL)。
211
+
212
+ ### Upsert
213
+
214
+ ```ts
215
+ // 单条 upsert,主键冲突则更新
216
+ await manager.upsert(tableUser, { id: 'us001', nickname: '赵云', balance: 10 })
217
+
218
+ // 批量 upsert
219
+ await manager.upsertMany(tableUser, [
220
+ { id: 'us002', nickname: '马超', balance: 20 },
221
+ { id: 'us003', nickname: '黄忠', balance: 30 }
222
+ ])
223
+
224
+ // 冲突时自定义更新(使用 Updater)
225
+ await manager.upsertWithUpdater(
226
+ tableUser,
227
+ { id: 'us001', nickname: '赵云', balance: 10 },
228
+ { balance: ['inc', 5], nickname: '赵云-updated' }
229
+ )
230
+ ```
231
+
232
+ ### 更新
233
+
234
+ ```ts
235
+ // 完整更新(需要完整文档)
236
+ await manager.update(tableUser, { id: 'xxx', nickname: '王五' })
237
+
238
+ // 局部更新
239
+ await manager.partialUpdate(tableUser, {
240
+ id: 'pu000',
241
+ // 自增 +22
242
+ balance: ['inc', 22],
243
+ // 自增 +1(默认值)
244
+ visits: ['inc'],
245
+ // NULL 安全的字符串追加
246
+ nickname: ['concat', '-suffix'],
247
+ // 设置为 NOW()
248
+ last_login_at: ['now'],
249
+ // 自定义表达式
250
+ score: ['expr', '?? * ?', ['score', 2]]
251
+ })
252
+
253
+ // 批量更新
254
+ await manager.updateMany(tableUser, c => c.like('nickname', 'um%'), { balance: ['inc', 2] })
255
+ ```
256
+
257
+ > **0.7.0 版本**开始,`null` 不再自动置 NULL。如需将字段设置为 NULL,必须显式使用 `['setNull']`。
258
+ > `['func']` 已移除,请使用 `['expr']` 替代(如 `['func', 'NOW()']` → `['expr', 'NOW()']`)。
259
+
260
+ ### 删除
261
+
262
+ ```ts
263
+ await manager.deleteById(tableUser, 'd0001')
264
+ await manager.deleteMany({ table: tableUser, criteria: { status: 'DISABLED' }, limit: 100 })
265
+ await manager.deleteOne(tableUser, { id: 'only_one' })
266
+ ```
267
+
268
+ **⚠️ `deleteMany` 是危险操作**,建议严格限制条件并设置 `limit` 参数。
269
+
270
+ ### 自定义 SQL
271
+
272
+ ```ts
273
+ // 查询
274
+ const list = await manager.query<{ author: string; book: string }>(
275
+ 'select u.nickname as author, b.name as book from ?? u left join ?? b on u.id=b.author_id where b.id is not null',
276
+ ['user', 'book']
277
+ )
278
+
279
+ // 修改
280
+ const affected = await manager.modify(`update user set nickname='无名' where nickname='佚名'`)
281
+ ```
282
+
283
+ ### 全部方法
284
+
285
+ | 方法 | 说明 | 危险 |
286
+ | :------------- | :--------------------------- | :--- |
287
+ | `findById` | 按 id 查询 | |
288
+ | `findByIdIn` | 批量 id 查询 | |
289
+ | `findFirst` | 查第一条符合条件的 | |
290
+ | `find` | 条件查询,支持 offset/limit | ⚠️ |
291
+ | `findSelect` | 条件查询,指定返回列 | ⚠️ |
292
+ | `findAll` | 全表查询 | ⚠️ |
293
+ | `existsBy` | 条件判断存在 | |
294
+ | `existsById` | id 判断存在 | |
295
+ | `count` | 统计数量 | ⚠️ |
296
+ | `paginate` | 分页查询 | ⚠️ |
297
+ | `paginateSelect` | 指定字段分页查询 | ⚠️ |
298
+ | `insert` | 插入单条 | |
299
+ | `insertMany` | 批量插入 | |
300
+ | `upsert` | 插入单条,主键冲突则更新 | |
301
+ | `upsertMany` | 批量 upsert | |
302
+ | `upsertWithUpdater` | upsert 单条,冲突时自定义更新 | |
303
+ | `update` | 完整更新 | |
304
+ | `partialUpdate`| 局部更新 | |
305
+ | `updateOne` | 更新第一条相等条件 | |
306
+ | `updateMany` | 批量更新 | ⚠️ |
307
+ | `deleteById` | 按 id 删除 | |
308
+ | `deleteOne` | 删除第一条相等条件 | |
309
+ | `deleteMany` | 批量删除 | ⚠️ |
310
+ | `query` | 自定义 SQL 查询 | |
311
+ | `modify` | 自定义 SQL 修改 | |
312
+
313
+ ---
314
+
315
+ ## JSON 类型支持
316
+
317
+ 在实体中直接定义 JSON 字段对应的 TS 类型即可,框架自动解析:
318
+
319
+ ```ts
320
+ interface Question {
321
+ id: string
322
+ options: { title: string; correct?: boolean }[]
323
+ }
324
+
325
+ export const tableQuestion: Table<Question> = {
326
+ tableName: 'question', id: 'id', columns: ['options']
327
+ }
328
+ ```
329
+
330
+ 条件查询支持 `json_extract` 和 `json_length`,使用元组代替列名:
331
+
332
+ ```ts
333
+ await manager.findFirst(tableQuestion, c =>
334
+ c.eq(['json_extract', 'question_setter', '$.id'], 'x333')
335
+ )
336
+ await manager.findFirst(tableQuestion, c =>
337
+ c.gt(['json_length', 'options'], 3)
338
+ )
339
+ ```
340
+
341
+ ---
342
+
343
+ ## 事务
344
+
345
+ ```ts
346
+ await manager.tx(async session => {
347
+ await session.partialUpdate(tableAccount, { id: accId, balance: ['inc', -amount] })
348
+ await session.insert(tableOrder, { id: orderId, amount })
349
+ }, { timeout: 3000 })
350
+ ```
351
+
352
+ 事务操作**必须使用 `session` 对象**,直接调用 `manager` 的方法不会在事务中生效。
353
+
354
+ 选项:
355
+ - `timeout`:超时时间(ms),超时后自动回滚并抛出 `MysqlException`
356
+ - `isolationLevel`:隔离级别(`REPEATABLE READ` 等)
357
+ - `accessMode`:读写模式(`READ WRITE` / `READ ONLY`)
358
+
359
+ ### 严格模式
360
+
361
+ `MYSQL_TRANSACTION_STRICT=true` 时启用严格模式,限制事务中的操作次数(`MYSQL_MAX_OPS_IN_STRICT_TX`,默认 10 次)。超限抛出 `MysqlException`。
362
+
363
+ ---
364
+
365
+ ## 内部实现要点
366
+
367
+ ### 连接管理
368
+
369
+ `enableMysql` 注册配置 → 可选迁移 → 创建 `Pool` → 构建 `MysqlManager` → 存入 `managerMap`。进程退出前自动关闭连接池。
370
+
371
+ ### 查询流程
372
+
373
+ `MysqlManager` 从连接池获取连接 → `Promise.race` 超时竞速 → 执行 SQL → 释放连接。
374
+
375
+ ### 慢查询
376
+
377
+ 所有 CRUD 操作(除自定义 SQL)自动计时,超过 `MYSQL_SLOW_SQL_MS` 时输出 WARN 日志。
378
+
379
+ ### Migration 实现
380
+
381
+ 版本管理的完整使用说明见[参考文档](./references/version-control.md)。
382
+
383
+ ---
384
+
385
+ ## 参考
386
+
387
+ - [多数据源(读写分离等高级用法)](./references/multi-datasource.md)
388
+ - [版本管理](./references/version-control.md)
@@ -0,0 +1,76 @@
1
+ # MySQL 多数据源
2
+
3
+ ## 启用多数据源
4
+
5
+ ```ts
6
+ await enableMysql() // 默认,以 MYSQL_ 为前缀
7
+ await enableMysql('d2') // 自定义,以 D2_ 为前缀
8
+
9
+ const mgr1 = getMysqlManager() // 默认
10
+ const mgr2 = getMysqlManager('d2') // d2
11
+ ```
12
+
13
+ 名称必须以英文字母开头,由字母数字下划线组成,不超过 32 位。环境变量前缀自动转换为大写。
14
+
15
+ 环境变量配置示例:
16
+
17
+ ```bash
18
+ # 默认 enableMysql(),前缀 MYSQL_
19
+ MYSQL_HOST=localhost
20
+ MYSQL_PORT=3306
21
+ MYSQL_USER=test
22
+ MYSQL_PASSWORD=abc123
23
+ MYSQL_DATABASE=test1
24
+
25
+ # enableMysql('d2'),前缀 D2_
26
+ D2_HOST=localhost
27
+ D2_PORT=3306
28
+ D2_USER=test2
29
+ D2_PASSWORD=abcdefg
30
+ D2_DATABASE=test2
31
+ ```
32
+
33
+ ---
34
+
35
+ ## 技巧:读写分离
36
+
37
+ 实体类的表配置(`Table<T>`)与数据库实例没有强制绑定关系,同一套表配置可以给多个 `MysqlManager` 使用。利用这个特性和多数据源,可以实现读写分离。
38
+
39
+ ```ts
40
+ import { enableMysql, getMysqlManager } from 'wok-server'
41
+ import { tableUser } from './user'
42
+
43
+ // 主库(读写)
44
+ await enableMysql('master')
45
+ // 只读库
46
+ await enableMysql('slave')
47
+
48
+ const masterMgr = getMysqlManager('master')
49
+ const slaveMgr = getMysqlManager('slave')
50
+
51
+ // 写操作使用主库
52
+ const newUser = await masterMgr.insert(tableUser, { id: '001', nickname: 'jack' })
53
+
54
+ // 读操作使用只读库
55
+ const user = await slaveMgr.findById(tableUser, '001')
56
+ ```
57
+
58
+ 环境变量分别配置两个源:
59
+
60
+ ```bash
61
+ # 主库
62
+ MASTER_HOST=master-db.example.com
63
+ MASTER_PORT=3306
64
+ MASTER_USER=writer
65
+ MASTER_PASSWORD=xxx
66
+ MASTER_DATABASE=mydb
67
+
68
+ # 只读库
69
+ SLAVE_HOST=slave-db.example.com
70
+ SLAVE_PORT=3306
71
+ SLAVE_USER=reader
72
+ SLAVE_PASSWORD=xxx
73
+ SLAVE_DATABASE=mydb
74
+ ```
75
+
76
+ 在 `main.ts` 入口中分别初始化后,将两个 manager 导出,业务模块按读写需求选择使用即可。
@@ -0,0 +1,22 @@
1
+ # MySQL 版本管理
2
+
3
+ 开启 `MYSQL_VERSION_CONTROL_ENABLED=true`,在 `db_migration/` 目录下创建 SQL 文件,文件名为纯数字:
4
+
5
+ ```
6
+ db_migration/
7
+ 1.sql # 版本号从 1 开始,必须连续递增
8
+ 2.sql
9
+ 3.sql
10
+ ```
11
+
12
+ 文件名必须是纯数字 + `.sql` 后缀(如 `1.sql`、`2.sql`),非数字前缀会导致 `parseInt` 失败而抛异常。编号必须从 1 开始连续递增,不连续也会抛异常。
13
+
14
+ 启动时自动在事务中检测当前版本,顺序执行未执行的 SQL 并更新版本号。
15
+
16
+ 版本信息存储在 `db_version` 表(单行 `key='db_version'`,`version` 列)。
17
+
18
+ > **⚠️ 注意事项:开销非常高的 SQL 不能放在版本管理中执行。** 比如在大表上创建/修改索引这类操作,执行耗时长且会锁表,可能阻塞线上服务。此类操作应单独在线上手动执行,不要放入迁移文件。
19
+
20
+ ## 实现细节
21
+
22
+ 使用独立的 `multipleStatements` 连接在事务中执行:读取当前版本 → 筛选待执行版本 → 逐个执行 SQL 并更新 `db_version` → 提交。出错需手动在数据库中修复后重新启动。
@@ -0,0 +1,158 @@
1
+ ---
2
+ name: wok-server-task
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
+ ## 源码与类型定义
17
+
18
+ 安装 `wok-server` 后,可通过以下路径查看源码与类型定义:
19
+
20
+ - 源码目录:`node_modules/wok-server/src/task/`
21
+ - 类型定义:`node_modules/wok-server/types/` (引用 task 组件的 `.d.ts` 文件)
22
+
23
+ 核心源码文件:
24
+
25
+ | 文件 | 说明 |
26
+ | :--------------- | :--------------------------------- |
27
+ | `index.ts` | 模块聚合导出 |
28
+ | `task.ts` | `Task` 接口、`TaskController`、`execTask` |
29
+ | `fixed-delay.ts` | `scheduleWithFixedDelay` 固定延迟 |
30
+ | `fixed-rate.ts` | `scheduleWithFixedRate` 固定频率 |
31
+ | `daily.ts` | `scheduleDailyTask` 每日定时 |
32
+
33
+ ---
34
+
35
+ ## 三种调度模式
36
+
37
+ ### scheduleWithFixedDelay — 固定延迟
38
+
39
+ ```ts
40
+ function scheduleWithFixedDelay(
41
+ initialDelay: number, // 首次延迟(秒),0-86400
42
+ delay: number, // 每次间隔(秒),1-86400
43
+ task: Task,
44
+ timeout?: number // 任务超时(ms),可选
45
+ ): TaskController
46
+ ```
47
+
48
+ **每次任务执行完毕后等待 `delay` 秒再执行下一次**。适合对间隔有严格要求的场景。
49
+
50
+ ```ts
51
+ import { scheduleWithFixedDelay } from 'wok-server'
52
+
53
+ const controller = scheduleWithFixedDelay(10, 60, {
54
+ name: '记录在线人数',
55
+ async run() {
56
+ const count = await countAuth()
57
+ await createPcu({ count, time: new Date() })
58
+ }
59
+ })
60
+
61
+ controller.stop() // 停止任务
62
+ ```
63
+
64
+ ### scheduleWithFixedRate — 固定频率
65
+
66
+ ```ts
67
+ function scheduleWithFixedRate(
68
+ initialDelay: number, // 首次延迟(秒),0-86400
69
+ period: number, // 执行周期(秒),1-86400
70
+ task: Task,
71
+ timeout?: number // 任务超时(ms),可选
72
+ ): TaskController
73
+ ```
74
+
75
+ 参数完全相同,区别在于:**以任务的开始时间计算周期**。如果任务执行时间超过周期,下次任务立即执行。与固定延迟区别的核心在于内部 `exec` 中的 `setTimeout` 计算方式不同——固定频率使用 `res.start + period - now`,首次执行时记录 `start` 时间戳。
76
+
77
+ ### scheduleDailyTask — 每日定时
78
+
79
+ ```ts
80
+ function scheduleDailyTask(
81
+ hours: number, // 时(0-23)
82
+ minutes: number, // 分(0-59)
83
+ task: Task,
84
+ timeout?: number
85
+ ): TaskController
86
+ ```
87
+
88
+ ```ts
89
+ const dc = scheduleDailyTask(1, 30, {
90
+ name: '学习报表',
91
+ async run() { /* 每天 1:30 执行 */ }
92
+ })
93
+ ```
94
+
95
+ 计算逻辑:当前时间在当天目标时间之前 → 当天执行;否则推迟到明天。
96
+
97
+ ---
98
+
99
+ ## Task 接口与 TaskController
100
+
101
+ ```ts
102
+ interface Task {
103
+ name: string // 任务名称,用于日志跟踪
104
+ run: () => Promise<void> // 异步执行函数
105
+ }
106
+
107
+ class TaskController {
108
+ isStopped(): boolean // 是否已停止
109
+ stop(): void // 停止任务,当前正在执行的不会被中断
110
+ }
111
+ ```
112
+
113
+ ---
114
+
115
+ ## 内置日志行为
116
+
117
+ `execTask` 函数统一封装了任务的执行过程:
118
+
119
+ - **开始时**:DEBUG 日志 `START TASK:{name}`
120
+ - **成功完成**:DEBUG 日志记录耗时
121
+ - **执行 > 5 分钟**:WARN 日志 `Task "{name}" takes too long`
122
+ - **异常**:ERROR 日志 `TASK ERROR: {name}`(包含异常详情)
123
+ - **超时**:如果设置了 timeout 并超时,`Promise.race` 抛出超时错误,被 catch 记录
124
+
125
+ ---
126
+
127
+ ## 参数校验
128
+
129
+ 所有调度函数都会对传入的延迟/周期参数进行校验:
130
+
131
+ ```ts
132
+ validate(
133
+ { initialDelay, delay },
134
+ {
135
+ initialDelay: [notNull(), min(0), max(3600 * 24)],
136
+ delay: [notNull(), min(1), max(3600 * 24)]
137
+ }
138
+ )
139
+ ```
140
+
141
+ 参数不合法时直接抛出 `ValidationException`。
142
+
143
+ ---
144
+
145
+ ## 内部实现要点
146
+
147
+ ### 调度循环
148
+
149
+ 两个固定模式的差异仅在循环逻辑:
150
+
151
+ - **FixedDelay**:`await execTask → setTimeout(exec, delay)` — 等上次执行完再开始计时
152
+ - **FixedRate**:`const res = await execTask → setTimeout(exec, res.start + period - now)` — 用开始时间计算,可能立即执行
153
+
154
+ 两者都在首次使用 `setTimeout` 延迟 `initialDelay` 秒,之后通过递归 `setTimeout`(而非 `setInterval`)控制,避免任务积压。
155
+
156
+ ### execTask 超时机制
157
+
158
+ 通过 `Promise.race([task.run(), timeoutPromise])` 实现。超时后外部 catch 记录 ERROR 日志,不会中断调度循环。