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,51 @@
1
+ # Lock
2
+
3
+ Locks coordinate multiple asynchronous operation flows, allowing these flows to execute sequentially. This is very useful in concurrent request scenarios. A request may have many asynchronous operations during processing. Under concurrent conditions, operations from different requests may interleave. If there are modification operations, errors may occur, such as inventory reduction and lottery draws.
4
+
5
+ ## Usage
6
+
7
+ Use the getLockManager function to get the lock manager object, and call the tryLock method to attempt to acquire a lock and execute logic upon successful acquisition.
8
+
9
+ Simple scenario example code:
10
+
11
+ ```ts
12
+ import { getLockManager } from 'wok-server'
13
+
14
+ interface Form {
15
+ id: string
16
+ quantity: number
17
+ }
18
+ // Create JSON handler, simulate inventory reduction request
19
+ createJsonHandler<Form>({
20
+ validation: {
21
+ id: [notBlank()],
22
+ quantity: [notNull(), min(1), max(10)]
23
+ },
24
+ async handle(body, exchange) {
25
+ const lock = getLockManager()
26
+ const res = lock.tryLock({
27
+ // Lock identifier, same identifiers create competition
28
+ key: `reduce-quantity-${body.id}`,
29
+ // Maximum wait time in seconds, tryLock returns false if lock not acquired within 2 seconds
30
+ waitSeconds: 2,
31
+ // Lock expiration time, set to hold lock for maximum 600 seconds to prevent deadlock
32
+ // If timeout occurs, other processes can acquire the lock regardless of whether run function completes
33
+ expiresInSeconds: 600,
34
+ // Execution function, executed if lock acquired successfully
35
+ // In concurrent request scenarios, requests that don't acquire the lock wait and execute in queue
36
+ async run() {
37
+ const product = await findProductById(body.id)
38
+ if (product.quantity < body.quantity) {
39
+ throw new BusinessException('Insufficient inventory')
40
+ }
41
+ await reduceQuantity(body.id, body.quantity)
42
+ }
43
+ })
44
+ // tryLock returns boolean indicating whether lock was acquired successfully
45
+ // If lock not acquired, provide business prompt
46
+ if (!res) {
47
+ throw new BusinessException('System busy, please try again later')
48
+ }
49
+ }
50
+ })
51
+ ```
@@ -0,0 +1,109 @@
1
+ # Logging
2
+
3
+ Logging is used to record information, supporting simple level control and file writing functionality.
4
+
5
+ ## Environment Variables
6
+
7
+ | Environment Variable | Default | Description |
8
+ | :--------------------- | :------ | :-------------------------------------------------------------------------- |
9
+ | LOG_LEVEL | info | Log level. Logs below the set level will not be output. Values: DEBUG, INFO, WARN, ERROR |
10
+ | LOG_FILE | false | true or false, indicating whether to enable file logging |
11
+ | LOG_FILE_MAX_DAYS | 30 | Number of days to keep log files |
12
+ | LOG_FILE_DIR | logs | Log file storage path, supports relative and absolute paths. Relative paths are relative to the process execution directory |
13
+ | LOG_CONSOLE | true | Whether to output logs to console, added in version 0.5 |
14
+ | LOG_FORMAT | text | Output log format, can be set to json or text, added in version 0.5. Note: console always outputs text |
15
+
16
+ ## Usage
17
+
18
+ Get the logger object through getLogger() function, then call its methods to output logs.
19
+
20
+ ```ts
21
+ const logger = getLogger()
22
+
23
+ logger.info('Normal log message')
24
+
25
+ const err = new Error('Error message test')
26
+ logger.error('Error log output', err)
27
+
28
+ if (logger.isDebugEnabled()) {
29
+ logger.debug(`Debug log output, args: ${JSON.stringify(args)}`)
30
+ }
31
+ ```
32
+
33
+ ## Check if a Log Level is Supported
34
+
35
+ The logger object provides isDebugEnabled, isInfoEnabled, isWarnEnabled, and isErrorEnabled methods to check if a log level is supported.
36
+
37
+ ```ts
38
+ if (logger.isDebugEnabled()) {
39
+ logger.debug('Debug log output')
40
+ }
41
+ ```
42
+
43
+ These methods determine whether the current level is supported before processing. If not supported, the log content is not built. In some cases, this avoids unnecessary overhead of building log messages.
44
+
45
+ ## Add Prefix to Logs
46
+
47
+ Starting from version 0.5, the getLogger function supports adding a prefix. For example:
48
+
49
+ ```ts
50
+ const logger = getLogger('my-module')
51
+ ```
52
+
53
+ This adds the prefix `[my-module]` to output logs, making it easier to distinguish logs from different modules.
54
+
55
+ For example, the default log without prefix is:
56
+
57
+ ```
58
+ [2024/08/19 16:27:18.214][INFO]Mysql migration
59
+ ```
60
+
61
+ With prefix added:
62
+
63
+ ```
64
+ [2024/08/19 16:27:18.214][INFO][my-module]Mysql migration
65
+ ```
66
+
67
+ ## Custom Log Storage
68
+
69
+ The setLogStore function allows customizing log storage. Once set, it overrides file storage. Even if file logging is enabled, logs will not be output to files.
70
+
71
+ Starting from version 0.5, logs are structured. The storage function parameters are log objects and configuration information, rather than a string.
72
+
73
+ ```ts
74
+ setLogStore((log: Log, config: LogConfig) => {
75
+ // log type is Log
76
+ // config type is LogConfig
77
+ // You can store log content in message queues or independent file storage systems as needed
78
+ messageQueue.push(log)
79
+ })
80
+ ```
81
+
82
+ Log definition:
83
+
84
+ ```ts
85
+ export interface Log {
86
+ /**
87
+ * Log time
88
+ */
89
+ time: Date
90
+ /**
91
+ * Log level
92
+ */
93
+ level: LogLevel
94
+ /**
95
+ * Log content
96
+ */
97
+ content: string
98
+ /**
99
+ * Error information
100
+ */
101
+ error?: any
102
+ /**
103
+ * Prefix information
104
+ */
105
+ prefix?: string
106
+ }
107
+ ```
108
+
109
+ LogConfig type contains the environment variable configuration information mentioned earlier, used to determine how to handle logs.
@@ -0,0 +1,256 @@
1
+ # MongoDB
2
+
3
+ The MongoDB component is built on top of the [official MongoDB driver](https://www.npmjs.com/package/mongodb), providing simple entity mapping and CRUD operations for ease of use.
4
+
5
+ ## Environment Variables
6
+
7
+ The MongoDB component supports multiple instances. By default, it uses MONGO as the prefix.
8
+
9
+ | Variable Name | Description |
10
+ | :-------------------------- | :-------------------------------------------------------------------------- |
11
+ | MONGO_URI | MongoDB connection string. Example: mongodb+srv://<user>:<password>@<cluster-url> |
12
+ | MONGO_MAX_POOL_SIZE | Maximum connection pool size, default 10 |
13
+ | MONGO_MIN_POOL_SIZE | Minimum connection pool size, default 1 |
14
+ | MONGO_MAX_CONNECTING | Maximum concurrent connections in pool, default 10 |
15
+ | MONGO_MAX_IDLE_TIME_MS | Maximum idle time for connections in milliseconds, default 60000 |
16
+ | MONGO_WAIT_QUEUE_TIMEOUT_MS | Maximum wait time for connections in milliseconds, default 60000 |
17
+ | MONGO_SLOW_QUERY_WARN | Slow query warning. When enabled, warning logs are output for slow queries. Default enabled |
18
+ | MONGO_SLOW_QUERY_MS | Slow query threshold in milliseconds, default 200 |
19
+ | MONGO_TRANSACTION_TIMEOUT | Transaction timeout in milliseconds, default 5000 |
20
+ | MONGO_TRANSACTION_STRICT | Transaction strict mode, default true. Set to false to disable |
21
+
22
+ ## Usage
23
+
24
+ ### Initialization
25
+
26
+ First use the enableMongoDB function to enable MongoDB, then use related features.
27
+
28
+ ```ts
29
+ await enableMongoDB()
30
+ ```
31
+
32
+ The component supports multiple instances. If multiple databases need to be connected, you can specify a new name.
33
+
34
+ ```ts
35
+ // Enable implementation with name md2
36
+ await enableMongoDB('md2')
37
+ ```
38
+
39
+ By default, environment variables use MONGO as the prefix. For named instances, the uppercase name is used as the prefix. In the example above, the instance named md2 uses the MD2 prefix.
40
+
41
+ ```
42
+ # Configure default connection
43
+ MONGO_URI=mongodb://test1:t1abcd@localhost/t1
44
+ MONGO_MAXPOOLSIZE=10
45
+ # Configure connection for md2 instance
46
+ MD2_URI=mongodb://test2:t2abcd@localhost/t2
47
+ MD2_MAXPOOLSIZE=10
48
+ ```
49
+
50
+ Use the getMongoDBManager function to get a manager instance for operating MongoDB, with optional name parameter to get the corresponding instance.
51
+
52
+ ```ts
53
+ // Default instance
54
+ const manager = getMongoDBManager()
55
+ // md2 instance
56
+ const md2 = getMongoDBManager('md2')
57
+ ```
58
+
59
+ ### Entity Mapping
60
+
61
+ Basic CRUD operations can be performed through the manager object's methods, but configuration is required before operation.
62
+
63
+ Configuration consists of two parts: collection data format definition and collection information settings. Here is an example:
64
+
65
+ ```ts
66
+ /**
67
+ * User collection data definition.
68
+ * Primary key name is fixed as _id, mapping configuration not supported. Entity class should not have _id field.
69
+ */
70
+ export interface User {
71
+ nickname: string
72
+ skills: string[]
73
+ // Create and update fields can be set to be automatically managed by the component
74
+ // Due to type constraints, set as optional for insertion and update without filling
75
+ createAt?: Date
76
+ updateAt?: Date
77
+ }
78
+ /**
79
+ * User collection information. Type is MongoCollection with generic type as entity type.
80
+ * Primary key name is fixed as _id, mapping configuration not supported.
81
+ */
82
+ export const collUser: MongoCollection<User> = {
83
+ /**
84
+ * Collection name
85
+ */
86
+ collectionName: 'user',
87
+ /**
88
+ * Configure creation time field, automatically managed by component
89
+ */
90
+ createdDate: {
91
+ type: 'date',
92
+ field: 'createAt'
93
+ },
94
+ /**
95
+ * Configure update time field, automatically managed by component
96
+ */
97
+ updatedDate: {
98
+ type: 'date',
99
+ field: 'updateAt'
100
+ }
101
+ }
102
+ ```
103
+
104
+ ### CRUD Operations
105
+
106
+ Now you can perform CRUD operations. All manager operations take the collection information as the first parameter, which is the collUser configured earlier.
107
+
108
+ ```ts
109
+ const manager = getMongoDBManager()
110
+ // Insert record. If _id has no value, database generates ObjectId as primary key
111
+ await manager.insert(collUser, { _id: '007', nickname: 'Spark', skills: [] })
112
+ // Find by id
113
+ const user1 = await manager.findById(collUser, '007')
114
+ // Update nickname
115
+ user1.nickname = 'ryan'
116
+ await manager.update(collUser, user1)
117
+ // Check if id exists
118
+ const exist = await manager.existsById(collUser, 'xyz')
119
+ // Check if record exists by condition
120
+ const exist2 = await manager.existsBy(collUser, { nickname: 'acute' })
121
+ // Delete by id
122
+ await manager.deleteById(collUser, '007')
123
+ // Delete by condition. Use with caution, deleting large amounts of data at once may cause high database load and online incidents
124
+ await manager.deleteMany(collUser, { nickname: 'smith' })
125
+ // Find first matching record
126
+ const jack = await manager.findFirst(collUser, { nickname: 'jack' })
127
+ // Find all records. Use with caution, querying large amounts of data at once may cause memory issues and take a long time to transfer
128
+ await manager.findAll(collUser)
129
+ // Count. Use with caution, count operation may have performance issues even with indexes for large data sets
130
+ const count = await manager.count(collUser, { nickname: 'Steve' })
131
+ // Find users with skills, return at most 2 results
132
+ const list = await manager.find(
133
+ collUser,
134
+ {
135
+ skills: { $exists: true }
136
+ },
137
+ { offset: 0, limit: 2 }
138
+ )
139
+ // Pagination, sort by id, 20 items per page, query page 2
140
+ const page = await manager.paginate(
141
+ collUser,
142
+ {
143
+ skills: { $exists: true }
144
+ },
145
+ { pn: 2, pz: 20, orderBy: ['_id', 'asc'] }
146
+ )
147
+ ```
148
+
149
+ ### Update Methods Description
150
+
151
+ The manager provides four update methods: update, partialUpdate, updateMany, updateOne.
152
+
153
+ | Method Name | Description |
154
+ | :------------- | :-------------------------------------------------------------------------- |
155
+ | update | Full document update, requires complete document information, returns updated document, throws exception on failure |
156
+ | partialUpdate | Partial update, only needs id and fields to update, returns whether update succeeded |
157
+ | updateMany | Update all matching records, returns number of updated documents |
158
+ | updateOne | Update only one matching record, only supports equality conditions, does not support range conditions |
159
+
160
+ ```ts
161
+ // update requires complete document, usually need to query first
162
+ const user = await manager.findById(collUser, '007')
163
+ user.nickname = 'ryan'
164
+ await manager.update(collUser, user)
165
+ // partialUpdate does not require querying first
166
+ // Update nickname of document with id 001 to lily
167
+ await manager.partialUpdate(collUser, '001', { $set: { nickname: 'lily' } })
168
+ // updateMany differs from partialUpdate only in that id parameter becomes condition
169
+ // Increment credit by 1 for all users with credit <= 10
170
+ await manager.updateMany(collUser, { credit: { $lte: 10 } }, { $inc: { credit: 1 } })
171
+ ```
172
+
173
+ ## Version Management
174
+
175
+ The enableMongoDB function supports a migration parameter for version management and automatic migration.
176
+
177
+ ```ts
178
+ await enableMongoDB({
179
+ migration: {
180
+ versionList: versionList
181
+ }
182
+ })
183
+ ```
184
+
185
+ versionList is an array of MongoMigrationVersion (`(db: Db) => Promise<void>`) type elements. Db is the database provided by the MongoDB driver, which can perform various operations such as creating collections and indexes.
186
+
187
+ The version number is the index of the element, meaning each program update should add elements. Existing elements cannot be modified, and the program does not perform any validation. During startup, the program checks the already updated version number (index of version list), then finds subsequent versions from the version list, updates them one by one, and marks the completed version numbers.
188
+
189
+ Here is an example of the versionList parameter:
190
+
191
+ ```ts
192
+ const versionList: MongoMigrationVersion[] = [
193
+ // Version 1
194
+ async db => {
195
+ // Create a collection, insert some data, then create indexes
196
+ await db.createCollection('user')
197
+ await db
198
+ .collection<User>('user')
199
+ .createIndex({ nickname: 1 }, { unique: true, name: 'uk_nickname' })
200
+ await db
201
+ .collection<User>('user')
202
+ .createIndex({ skills: 1 }, { unique: false, name: 'idx_skills' })
203
+ // Preset data
204
+ await db.collection<User>('user').insertOne({
205
+ nickname: 'jack',
206
+ skills: ['java'],
207
+ createAt: new Date(),
208
+ updateAt: new Date()
209
+ })
210
+ },
211
+ // Version 2
212
+ async db => {
213
+ // Delete an index
214
+ await db.collection<User>('user').dropIndex('idx_skills')
215
+ // Preset data
216
+ await db.collection<User>('user').insertOne({
217
+ nickname: 'tom',
218
+ skills: ['golang', 'rust'],
219
+ createAt: new Date(),
220
+ updateAt: new Date()
221
+ })
222
+ }
223
+ ]
224
+ ```
225
+
226
+ ## Transactions
227
+
228
+ Use the manager object's tx method to execute transaction operations. The method accepts a function parameter whose parameter is a session object. **All operations in the transaction must call session methods, which are the same as manager methods**.
229
+
230
+ ```ts
231
+ await manager.tx(
232
+ async session => {
233
+ // Update order and account balance in transaction
234
+ // orderId Order ID
235
+ // accountId Account ID
236
+ // amount Order amount
237
+ await session.partialUpdate(collOrder, orderId, { $set: { status: 'finished' } })
238
+ await session.partialUpdate(collAccount, accountId, { $inc: { balance: -amount } })
239
+ },
240
+ // Additional options, can set timeout per transaction
241
+ { timeout: 1000 }
242
+ )
243
+ ```
244
+
245
+ ### Strict Mode
246
+
247
+ Transactions have strict mode enabled by default. Many operations are prohibited in strict mode. Set the environment variable MONGO_TRANSACTION_STRICT (default variable name, use corresponding name for multiple instances) to false to disable it.
248
+
249
+ In strict mode, the following operations are prohibited in transactions:
250
+
251
+ 1. Bulk insert insertMany
252
+ 2. Bulk update updateMany
253
+ 3. Bulk delete deleteMany
254
+ 4. Bulk query and count find, count, paginate
255
+ 5. findByIdIn with more than 100 parameters
256
+ 6. Any operation called via session exceeding 10 times