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.
- package/README.en.md +61 -0
- package/README.md +44 -29
- package/dist/cache/cache.js +98 -98
- package/dist/cache/config.js +19 -19
- package/dist/cache/index.js +27 -27
- package/dist/cache/purge-task.js +46 -46
- package/dist/cache/stat.js +47 -47
- package/dist/config/convert.js +36 -36
- package/dist/config/exception.js +14 -14
- package/dist/config/index.js +81 -81
- package/dist/http-client/index.js +136 -136
- package/dist/i18n/ar.js +17 -17
- package/dist/i18n/de.js +17 -17
- package/dist/i18n/en-us.js +17 -17
- package/dist/i18n/es.js +17 -17
- package/dist/i18n/fr.js +17 -17
- package/dist/i18n/i18n.js +231 -231
- package/dist/i18n/index.js +52 -52
- package/dist/i18n/ja.js +17 -17
- package/dist/i18n/ko.js +17 -17
- package/dist/i18n/msg.js +2 -2
- package/dist/i18n/pt.js +17 -17
- package/dist/i18n/ru.js +17 -17
- package/dist/i18n/tag.js +18 -18
- package/dist/i18n/zh-HK.js +17 -17
- package/dist/i18n/zh-TW.js +17 -17
- package/dist/i18n/zh-cn.js +17 -17
- package/dist/index.js +14 -14
- package/dist/lock/index.js +114 -114
- package/dist/log/config.js +35 -29
- package/dist/log/date.js +21 -21
- package/dist/log/file.js +198 -72
- package/dist/log/index.js +135 -105
- package/dist/log/level.js +33 -33
- package/dist/log/log.js +56 -0
- package/dist/log/store.js +19 -16
- package/dist/mongodb/collection.js +2 -2
- package/dist/mongodb/config.js +34 -34
- package/dist/mongodb/doc.js +2 -2
- package/dist/mongodb/exception.js +14 -14
- package/dist/mongodb/index.js +58 -58
- package/dist/mongodb/manager/base.js +563 -563
- package/dist/mongodb/manager/index.js +63 -63
- package/dist/mongodb/manager/tx-strict.js +84 -84
- package/dist/mongodb/manager/tx.js +30 -30
- package/dist/mongodb/migration.js +52 -52
- package/dist/mvc/access-log.js +33 -33
- package/dist/mvc/config.js +27 -27
- package/dist/mvc/exchange.js +113 -113
- package/dist/mvc/handler/index.js +7 -6
- package/dist/mvc/handler/json.js +65 -65
- package/dist/mvc/handler/restful.js +35 -35
- package/dist/mvc/handler/sse.js +65 -0
- package/dist/mvc/handler/upload.js +31 -31
- package/dist/mvc/index.js +50 -50
- package/dist/mvc/interceptor.js +2 -2
- package/dist/mvc/query.js +43 -43
- package/dist/mvc/render/file.js +132 -132
- package/dist/mvc/render/html/html.js +90 -90
- package/dist/mvc/render/html/index.js +18 -18
- package/dist/mvc/render/html/style.js +2 -2
- package/dist/mvc/render/index.js +7 -7
- package/dist/mvc/render/json.js +26 -26
- package/dist/mvc/render/text.js +16 -16
- package/dist/mvc/router.js +2 -2
- package/dist/mvc/server.js +272 -272
- package/dist/mvc/static/header.js +67 -67
- package/dist/mvc/static/index.js +6 -6
- package/dist/mvc/static/mime-type.js +84 -84
- package/dist/mvc/static/server-cache-config.js +66 -66
- package/dist/mvc/static/server-cache.js +133 -133
- package/dist/mvc/static/static-handler.js +372 -372
- package/dist/mysql/config.js +51 -51
- package/dist/mysql/exception.js +14 -14
- package/dist/mysql/index.js +87 -87
- package/dist/mysql/manager/base.js +239 -231
- package/dist/mysql/manager/index.js +107 -107
- package/dist/mysql/manager/ops/count.js +20 -20
- package/dist/mysql/manager/ops/criteria.js +356 -356
- package/dist/mysql/manager/ops/delete.js +65 -65
- package/dist/mysql/manager/ops/exist.js +26 -26
- package/dist/mysql/manager/ops/find.js +169 -130
- package/dist/mysql/manager/ops/index.js +14 -14
- package/dist/mysql/manager/ops/insert.js +106 -106
- package/dist/mysql/manager/ops/modify.js +10 -10
- package/dist/mysql/manager/ops/paginate.js +23 -23
- package/dist/mysql/manager/ops/query.js +9 -9
- package/dist/mysql/manager/ops/update.js +216 -216
- package/dist/mysql/manager/ops/utils.js +24 -24
- package/dist/mysql/manager/tx-strict.js +103 -100
- package/dist/mysql/manager/tx.js +30 -30
- package/dist/mysql/manager/utils.js +56 -56
- package/dist/mysql/migration.js +136 -136
- package/dist/mysql/table-info.js +8 -8
- package/dist/task/daily.js +59 -59
- package/dist/task/fixed-delay.js +38 -38
- package/dist/task/fixed-rate.js +42 -42
- package/dist/task/index.js +9 -9
- package/dist/task/task.js +56 -56
- package/dist/validation/exception.js +36 -36
- package/dist/validation/index.js +40 -40
- package/dist/validation/validator/array.js +34 -34
- package/dist/validation/validator/enum.js +28 -28
- package/dist/validation/validator/index.js +14 -14
- package/dist/validation/validator/length.js +40 -40
- package/dist/validation/validator/max-length.js +35 -35
- package/dist/validation/validator/max.js +29 -29
- package/dist/validation/validator/min-length.js +33 -33
- package/dist/validation/validator/min.js +29 -29
- package/dist/validation/validator/not-blank.js +33 -33
- package/dist/validation/validator/not-null.js +21 -21
- package/dist/validation/validator/plain-obj.js +32 -32
- package/dist/validation/validator/regexp.js +34 -34
- package/documentation/en/cache.md +56 -0
- package/documentation/en/config.md +96 -0
- package/documentation/en/engineering.md +256 -0
- package/documentation/en/http-client.md +32 -0
- package/documentation/en/i18n.md +143 -0
- package/documentation/en/index.md +24 -0
- package/documentation/en/lock.md +51 -0
- package/documentation/en/log.md +109 -0
- package/documentation/en/mongodb.md +256 -0
- package/documentation/en/mvc.md +688 -0
- package/documentation/en/mysql.md +552 -0
- package/documentation/en/task.md +45 -0
- package/documentation/en/test.md +56 -0
- package/documentation/en/validate.md +130 -0
- package/documentation/zh-cn/engineering.md +1 -1
- package/documentation/zh-cn/log.md +81 -8
- package/documentation/zh-cn/mvc.md +66 -24
- package/documentation/zh-cn/mysql.md +24 -23
- package/documentation/zh-cn/validate.md +2 -2
- package/package.json +3 -1
- package/skills/wok-server-api-rules/SKILL.md +350 -0
- package/skills/wok-server-cache/SKILL.md +216 -0
- package/skills/wok-server-config/SKILL.md +200 -0
- package/skills/wok-server-getting-started/SKILL.md +123 -0
- package/skills/wok-server-getting-started/references/engineering.md +169 -0
- package/skills/wok-server-http-client/SKILL.md +164 -0
- package/skills/wok-server-i18n/SKILL.md +214 -0
- package/skills/wok-server-lock/SKILL.md +144 -0
- package/skills/wok-server-log/SKILL.md +218 -0
- package/skills/wok-server-mongodb/SKILL.md +235 -0
- package/skills/wok-server-mvc/SKILL.md +251 -0
- package/skills/wok-server-mvc/references/respond-html.md +157 -0
- package/skills/wok-server-mvc/references/sse.md +121 -0
- package/skills/wok-server-mvc/references/static-files.md +47 -0
- package/skills/wok-server-mvc/references/upload.md +62 -0
- package/skills/wok-server-mvc/references/websocket.md +30 -0
- package/skills/wok-server-mysql/SKILL.md +315 -0
- package/skills/wok-server-mysql/references/multi-datasource.md +76 -0
- package/skills/wok-server-mysql/references/version-control.md +22 -0
- package/skills/wok-server-task/SKILL.md +158 -0
- package/skills/wok-server-validate/SKILL.md +167 -0
- package/src/cache/cache.ts +118 -0
- package/src/cache/config.ts +53 -0
- package/src/cache/index.ts +27 -0
- package/src/cache/purge-task.ts +53 -0
- package/src/cache/stat.ts +47 -0
- package/src/config/convert.ts +27 -0
- package/src/config/exception.ts +8 -0
- package/src/config/index.ts +92 -0
- package/src/http-client/index.ts +202 -0
- package/src/i18n/ar.ts +16 -0
- package/src/i18n/de.ts +16 -0
- package/src/i18n/en-us.ts +16 -0
- package/src/i18n/es.ts +16 -0
- package/src/i18n/fr.ts +16 -0
- package/src/i18n/i18n.ts +230 -0
- package/src/i18n/index.ts +50 -0
- package/src/i18n/ja.ts +16 -0
- package/src/i18n/ko.ts +16 -0
- package/src/i18n/msg.ts +50 -0
- package/src/i18n/pt.ts +16 -0
- package/src/i18n/ru.ts +16 -0
- package/src/i18n/tag.ts +18 -0
- package/src/i18n/zh-HK.ts +16 -0
- package/src/i18n/zh-TW.ts +16 -0
- package/src/i18n/zh-cn.ts +16 -0
- package/src/index.ts +11 -0
- package/src/lock/index.ts +164 -0
- package/src/log/config.ts +71 -0
- package/src/log/date.ts +19 -0
- package/src/log/file.ts +215 -0
- package/src/log/index.ts +136 -0
- package/src/log/level.ts +29 -0
- package/src/log/log.ts +77 -0
- package/src/log/store.ts +31 -0
- package/src/mongodb/collection.ts +25 -0
- package/src/mongodb/config.ts +69 -0
- package/src/mongodb/doc.ts +12 -0
- package/src/mongodb/exception.ts +8 -0
- package/src/mongodb/index.ts +71 -0
- package/src/mongodb/manager/base.ts +674 -0
- package/src/mongodb/manager/index.ts +80 -0
- package/src/mongodb/manager/tx-strict.ts +153 -0
- package/src/mongodb/manager/tx.ts +34 -0
- package/src/mongodb/migration.ts +66 -0
- package/src/mvc/access-log.ts +33 -0
- package/src/mvc/config.ts +70 -0
- package/src/mvc/exchange.ts +126 -0
- package/src/mvc/handler/index.ts +4 -0
- package/src/mvc/handler/json.ts +96 -0
- package/src/mvc/handler/restful.ts +39 -0
- package/src/mvc/handler/sse.ts +90 -0
- package/src/mvc/handler/upload.ts +54 -0
- package/src/mvc/index.ts +48 -0
- package/src/mvc/interceptor.ts +12 -0
- package/src/mvc/query.ts +36 -0
- package/src/mvc/render/file.ts +148 -0
- package/src/mvc/render/html/html.ts +187 -0
- package/src/mvc/render/html/index.ts +16 -0
- package/src/mvc/render/html/style.ts +1201 -0
- package/src/mvc/render/index.ts +4 -0
- package/src/mvc/render/json.ts +24 -0
- package/src/mvc/render/text.ts +14 -0
- package/src/mvc/router.ts +13 -0
- package/src/mvc/server.ts +315 -0
- package/src/mvc/static/header.ts +86 -0
- package/src/mvc/static/index.ts +3 -0
- package/src/mvc/static/mime-type.ts +81 -0
- package/src/mvc/static/server-cache-config.ts +92 -0
- package/src/mvc/static/server-cache.ts +171 -0
- package/src/mvc/static/static-handler.ts +445 -0
- package/src/mysql/config.ts +130 -0
- package/src/mysql/exception.ts +8 -0
- package/src/mysql/index.ts +88 -0
- package/src/mysql/manager/base.ts +285 -0
- package/src/mysql/manager/index.ts +112 -0
- package/src/mysql/manager/ops/count.ts +30 -0
- package/src/mysql/manager/ops/criteria.ts +412 -0
- package/src/mysql/manager/ops/delete.ts +96 -0
- package/src/mysql/manager/ops/exist.ts +41 -0
- package/src/mysql/manager/ops/find.ts +226 -0
- package/src/mysql/manager/ops/index.ts +11 -0
- package/src/mysql/manager/ops/insert.ts +120 -0
- package/src/mysql/manager/ops/modify.ts +14 -0
- package/src/mysql/manager/ops/paginate.ts +60 -0
- package/src/mysql/manager/ops/query.ts +13 -0
- package/src/mysql/manager/ops/update.ts +294 -0
- package/src/mysql/manager/ops/utils.ts +20 -0
- package/src/mysql/manager/tx-strict.ts +138 -0
- package/src/mysql/manager/tx.ts +31 -0
- package/src/mysql/manager/utils.ts +75 -0
- package/src/mysql/migration.ts +149 -0
- package/src/mysql/table-info.ts +41 -0
- package/src/task/daily.ts +70 -0
- package/src/task/fixed-delay.ts +45 -0
- package/src/task/fixed-rate.ts +49 -0
- package/src/task/index.ts +4 -0
- package/src/task/task.ts +70 -0
- package/src/validation/exception.ts +27 -0
- package/src/validation/index.ts +61 -0
- package/src/validation/validator/array.ts +32 -0
- package/src/validation/validator/enum.ts +25 -0
- package/src/validation/validator/index.ts +11 -0
- package/src/validation/validator/length.ts +42 -0
- package/src/validation/validator/max-length.ts +33 -0
- package/src/validation/validator/max.ts +26 -0
- package/src/validation/validator/min-length.ts +31 -0
- package/src/validation/validator/min.ts +26 -0
- package/src/validation/validator/not-blank.ts +31 -0
- package/src/validation/validator/not-null.ts +19 -0
- package/src/validation/validator/plain-obj.ts +30 -0
- package/src/validation/validator/regexp.ts +32 -0
- package/types/cache/cache.d.ts +52 -52
- package/types/cache/config.d.ts +32 -32
- package/types/cache/index.d.ts +2 -2
- package/types/cache/purge-task.d.ts +11 -11
- package/types/cache/stat.d.ts +26 -26
- package/types/config/convert.d.ts +6 -6
- package/types/config/exception.d.ts +7 -7
- package/types/config/index.d.ts +25 -25
- package/types/http-client/index.d.ts +71 -71
- package/types/i18n/ar.d.ts +2 -2
- package/types/i18n/de.d.ts +2 -2
- package/types/i18n/en-us.d.ts +2 -2
- package/types/i18n/es.d.ts +2 -2
- package/types/i18n/fr.d.ts +2 -2
- package/types/i18n/i18n.d.ts +102 -102
- package/types/i18n/index.d.ts +9 -9
- package/types/i18n/ja.d.ts +2 -2
- package/types/i18n/ko.d.ts +2 -2
- package/types/i18n/msg.d.ts +50 -50
- package/types/i18n/pt.d.ts +2 -2
- package/types/i18n/ru.d.ts +2 -2
- package/types/i18n/tag.d.ts +11 -11
- package/types/i18n/zh-HK.d.ts +2 -2
- package/types/i18n/zh-TW.d.ts +2 -2
- package/types/i18n/zh-cn.d.ts +2 -2
- package/types/index.d.ts +11 -11
- package/types/lock/index.d.ts +64 -64
- package/types/log/config.d.ts +35 -27
- package/types/log/date.d.ts +2 -2
- package/types/log/file.d.ts +13 -5
- package/types/log/index.d.ts +53 -34
- package/types/log/level.d.ts +14 -14
- package/types/log/log.d.ts +40 -0
- package/types/log/store.d.ts +19 -12
- package/types/mongodb/collection.d.ts +25 -25
- package/types/mongodb/config.d.ts +45 -45
- package/types/mongodb/doc.d.ts +11 -11
- package/types/mongodb/exception.d.ts +7 -7
- package/types/mongodb/index.d.ts +29 -29
- package/types/mongodb/manager/base.d.ts +188 -188
- package/types/mongodb/manager/index.d.ts +38 -38
- package/types/mongodb/manager/tx-strict.d.ts +41 -41
- package/types/mongodb/manager/tx.d.ts +21 -21
- package/types/mongodb/migration.d.ts +12 -12
- package/types/mvc/access-log.d.ts +7 -7
- package/types/mvc/config.d.ts +42 -42
- package/types/mvc/exchange.d.ts +72 -72
- package/types/mvc/handler/index.d.ts +4 -3
- package/types/mvc/handler/json.d.ts +44 -44
- package/types/mvc/handler/restful.d.ts +11 -11
- package/types/mvc/handler/sse.d.ts +34 -0
- package/types/mvc/handler/upload.d.ts +36 -36
- package/types/mvc/index.d.ts +22 -22
- package/types/mvc/interceptor.d.ts +11 -11
- package/types/mvc/query.d.ts +13 -13
- package/types/mvc/render/file.d.ts +10 -10
- package/types/mvc/render/html/html.d.ts +98 -98
- package/types/mvc/render/html/index.d.ts +11 -11
- package/types/mvc/render/html/style.d.ts +1201 -1201
- package/types/mvc/render/index.d.ts +4 -4
- package/types/mvc/render/json.d.ts +17 -17
- package/types/mvc/render/text.d.ts +10 -10
- package/types/mvc/router.d.ts +11 -11
- package/types/mvc/server.d.ts +90 -90
- package/types/mvc/static/header.d.ts +27 -27
- package/types/mvc/static/index.d.ts +3 -3
- package/types/mvc/static/mime-type.d.ts +2 -2
- package/types/mvc/static/server-cache-config.d.ts +30 -30
- package/types/mvc/static/server-cache.d.ts +76 -76
- package/types/mvc/static/static-handler.d.ts +77 -77
- package/types/mysql/config.d.ts +90 -90
- package/types/mysql/exception.d.ts +7 -7
- package/types/mysql/index.d.ts +16 -16
- package/types/mysql/manager/base.d.ts +165 -159
- package/types/mysql/manager/index.d.ts +36 -36
- package/types/mysql/manager/ops/count.d.ts +13 -13
- package/types/mysql/manager/ops/criteria.d.ts +134 -134
- package/types/mysql/manager/ops/delete.d.ts +46 -46
- package/types/mysql/manager/ops/exist.d.ts +6 -6
- package/types/mysql/manager/ops/find.d.ts +86 -70
- package/types/mysql/manager/ops/index.d.ts +10 -10
- package/types/mysql/manager/ops/insert.d.ts +18 -18
- package/types/mysql/manager/ops/modify.d.ts +3 -3
- package/types/mysql/manager/ops/paginate.d.ts +36 -36
- package/types/mysql/manager/ops/query.d.ts +3 -3
- package/types/mysql/manager/ops/update.d.ts +76 -76
- package/types/mysql/manager/ops/utils.d.ts +5 -5
- package/types/mysql/manager/tx-strict.d.ts +36 -35
- package/types/mysql/manager/tx.d.ts +15 -15
- package/types/mysql/manager/utils.d.ts +17 -17
- package/types/mysql/migration.d.ts +8 -8
- package/types/mysql/table-info.d.ts +36 -36
- package/types/task/daily.d.ts +16 -16
- package/types/task/fixed-delay.d.ts +9 -9
- package/types/task/fixed-rate.d.ts +9 -9
- package/types/task/index.d.ts +4 -4
- package/types/task/task.d.ts +34 -34
- package/types/validation/exception.d.ts +38 -38
- package/types/validation/index.d.ts +32 -32
- package/types/validation/validator/array.d.ts +5 -5
- package/types/validation/validator/enum.d.ts +8 -8
- package/types/validation/validator/index.d.ts +11 -11
- package/types/validation/validator/length.d.ts +10 -10
- package/types/validation/validator/max-length.d.ts +8 -8
- package/types/validation/validator/max.d.ts +7 -7
- package/types/validation/validator/min-length.d.ts +6 -6
- package/types/validation/validator/min.d.ts +7 -7
- package/types/validation/validator/not-blank.d.ts +7 -7
- package/types/validation/validator/not-null.d.ts +6 -6
- package/types/validation/validator/plain-obj.d.ts +7 -7
- 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
|