w-orm-mongodb 1.1.40 → 1.1.42
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.md +38 -1
- package/dist/w-orm-mongodb.umd.js +2 -2
- package/dist/w-orm-mongodb.umd.js.map +1 -1
- package/docs/WOrmMongodb.html +11 -11
- package/docs/WOrmMongodb.mjs.html +160 -59
- package/docs/index.html +1 -1
- package/package.json +1 -1
- package/src/WOrmMongodb.mjs +158 -57
- package/test/api-basic.test.mjs +245 -0
- package/test/api-gfs.test.mjs +107 -0
|
@@ -45,8 +45,7 @@
|
|
|
45
45
|
|
|
46
46
|
<section>
|
|
47
47
|
<article>
|
|
48
|
-
<pre class="prettyprint source linenums"><code>import
|
|
49
|
-
import mongodb from 'mongodb'
|
|
48
|
+
<pre class="prettyprint source linenums"><code>import mongodb from 'mongodb'
|
|
50
49
|
import stream from 'stream'
|
|
51
50
|
import cloneDeep from 'lodash-es/cloneDeep.js'
|
|
52
51
|
import every from 'lodash-es/every.js'
|
|
@@ -54,8 +53,9 @@ import get from 'lodash-es/get.js'
|
|
|
54
53
|
import map from 'lodash-es/map.js'
|
|
55
54
|
import omit from 'lodash-es/omit.js'
|
|
56
55
|
import size from 'lodash-es/size.js'
|
|
56
|
+
import evem from 'wsemi/src/evem.mjs'
|
|
57
57
|
import genPm from 'wsemi/src/genPm.mjs'
|
|
58
|
-
import
|
|
58
|
+
import genIDSeq from 'wsemi/src/genIDSeq.mjs'
|
|
59
59
|
import isbol from 'wsemi/src/isbol.mjs'
|
|
60
60
|
import isestr from 'wsemi/src/isestr.mjs'
|
|
61
61
|
import isarr from 'wsemi/src/isarr.mjs'
|
|
@@ -110,8 +110,9 @@ function WOrmMongodb(opt = {}) {
|
|
|
110
110
|
let _indexGfsReady = false
|
|
111
111
|
|
|
112
112
|
|
|
113
|
-
//ee
|
|
114
|
-
|
|
113
|
+
//ee, 採wsemi之evem(即eventemitter3), 其於'error'無監聽者時僅回傳false而不拋出,
|
|
114
|
+
//故本套件之操作行為不因呼叫端有無註冊監聽而改變; Node內建之EventEmitter具該拋出語義, 不可用
|
|
115
|
+
let ee = evem()
|
|
115
116
|
|
|
116
117
|
|
|
117
118
|
//MongoClient
|
|
@@ -125,7 +126,7 @@ function WOrmMongodb(opt = {}) {
|
|
|
125
126
|
* @param {Error|String} err 輸入錯誤物件或字串
|
|
126
127
|
* @returns {String} 回傳錯誤訊息字串
|
|
127
128
|
*/
|
|
128
|
-
function
|
|
129
|
+
function getErrMsg(err) {
|
|
129
130
|
|
|
130
131
|
//message
|
|
131
132
|
let message = get(err, 'message')
|
|
@@ -156,6 +157,28 @@ function WOrmMongodb(opt = {}) {
|
|
|
156
157
|
}
|
|
157
158
|
|
|
158
159
|
|
|
160
|
+
/**
|
|
161
|
+
* 發出error事件,操作發生錯誤時發出,錯誤訊息一律轉為字串
|
|
162
|
+
* 註: 事件僅為附加通知,所送出之資訊必另有正規管道——整批性錯誤經Promise.reject,逐筆失敗經該筆之err欄位
|
|
163
|
+
* 註: 訂閱函數拋錯不得影響本次操作之結果,故另包try並自行吞掉
|
|
164
|
+
* 註: 正常結果不得發出本事件,如insert全數已存在、save合併後內容相同、del主鍵未命中、selectByPk查無數據
|
|
165
|
+
*
|
|
166
|
+
* @ignore
|
|
167
|
+
* @param {String} mode 輸入操作別字串
|
|
168
|
+
* @param {Array|null} data 輸入本次操作之數據
|
|
169
|
+
* @param {Error|String} err 輸入錯誤物件或字串
|
|
170
|
+
* @returns {undefined} 無回傳值
|
|
171
|
+
*/
|
|
172
|
+
function emitError(mode, data, err) {
|
|
173
|
+
try {
|
|
174
|
+
ee.emit('error', mode, data, getErrMsg(err))
|
|
175
|
+
}
|
|
176
|
+
catch (errEmit) {
|
|
177
|
+
console.log(errEmit)
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
159
182
|
/**
|
|
160
183
|
* 檢查並補齊單筆數據之主鍵
|
|
161
184
|
* autoGenPk為true時未帶有效id者自動產生,為false時往外拋
|
|
@@ -178,8 +201,8 @@ function WOrmMongodb(opt = {}) {
|
|
|
178
201
|
throw new Error(`invalid data[${k}].id, autoGenPk is false`)
|
|
179
202
|
}
|
|
180
203
|
|
|
181
|
-
//
|
|
182
|
-
v.id =
|
|
204
|
+
//genIDSeq
|
|
205
|
+
v.id = genIDSeq()
|
|
183
206
|
|
|
184
207
|
}
|
|
185
208
|
|
|
@@ -357,7 +380,12 @@ function WOrmMongodb(opt = {}) {
|
|
|
357
380
|
client = null
|
|
358
381
|
}
|
|
359
382
|
|
|
383
|
+
//check
|
|
360
384
|
if (isErr) {
|
|
385
|
+
|
|
386
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
387
|
+
emitError('select', null, res)
|
|
388
|
+
|
|
361
389
|
return Promise.reject(res)
|
|
362
390
|
}
|
|
363
391
|
return res
|
|
@@ -415,7 +443,12 @@ function WOrmMongodb(opt = {}) {
|
|
|
415
443
|
client = null
|
|
416
444
|
}
|
|
417
445
|
|
|
446
|
+
//check
|
|
418
447
|
if (isErr) {
|
|
448
|
+
|
|
449
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
450
|
+
emitError('selectByPk', null, res)
|
|
451
|
+
|
|
419
452
|
return Promise.reject(res)
|
|
420
453
|
}
|
|
421
454
|
return res
|
|
@@ -516,7 +549,12 @@ function WOrmMongodb(opt = {}) {
|
|
|
516
549
|
emitChange('insert', data, res)
|
|
517
550
|
}
|
|
518
551
|
|
|
552
|
+
//check
|
|
519
553
|
if (isErr) {
|
|
554
|
+
|
|
555
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
556
|
+
emitError('insert', data, res)
|
|
557
|
+
|
|
520
558
|
return Promise.reject(res)
|
|
521
559
|
}
|
|
522
560
|
return res
|
|
@@ -621,7 +659,7 @@ function WOrmMongodb(opt = {}) {
|
|
|
621
659
|
nInserted: 0,
|
|
622
660
|
nModified: 0,
|
|
623
661
|
ok: 0,
|
|
624
|
-
err:
|
|
662
|
+
err: getErrMsg(err),
|
|
625
663
|
}
|
|
626
664
|
|
|
627
665
|
break
|
|
@@ -634,6 +672,11 @@ function WOrmMongodb(opt = {}) {
|
|
|
634
672
|
emitChange('insert', [v], rest)
|
|
635
673
|
}
|
|
636
674
|
|
|
675
|
+
//emit, 逐筆失敗須於該筆結果定案後發出, 每筆一次
|
|
676
|
+
if (rest.ok === 0) {
|
|
677
|
+
emitError('save', [v], rest.err)
|
|
678
|
+
}
|
|
679
|
+
|
|
637
680
|
return rest
|
|
638
681
|
}
|
|
639
682
|
|
|
@@ -709,7 +752,12 @@ function WOrmMongodb(opt = {}) {
|
|
|
709
752
|
emitChange('save', data, res)
|
|
710
753
|
}
|
|
711
754
|
|
|
755
|
+
//check
|
|
712
756
|
if (isErr) {
|
|
757
|
+
|
|
758
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
759
|
+
emitError('save', data, res)
|
|
760
|
+
|
|
713
761
|
return Promise.reject(res)
|
|
714
762
|
}
|
|
715
763
|
return res
|
|
@@ -761,49 +809,60 @@ function WOrmMongodb(opt = {}) {
|
|
|
761
809
|
//id, del不補值, 未帶有效id者視為本筆無法處理
|
|
762
810
|
let id = get(v, 'id')
|
|
763
811
|
|
|
812
|
+
//rest
|
|
813
|
+
let rest = null
|
|
814
|
+
|
|
764
815
|
//check, 不得將無效id送進查詢條件, 因undefined經序列化為null會誤中id為null之數據
|
|
765
816
|
if (!isestr(id)) {
|
|
766
|
-
|
|
817
|
+
|
|
818
|
+
//rest
|
|
819
|
+
rest = {
|
|
767
820
|
n: 0,
|
|
768
821
|
nDeleted: 0,
|
|
769
822
|
ok: 0,
|
|
770
823
|
err: `invalid id[${id}]`,
|
|
771
824
|
}
|
|
825
|
+
|
|
772
826
|
}
|
|
827
|
+
else {
|
|
773
828
|
|
|
774
|
-
|
|
775
|
-
let rest = null
|
|
829
|
+
try {
|
|
776
830
|
|
|
777
|
-
|
|
831
|
+
//deleteOne
|
|
832
|
+
let r = await collection.deleteOne({ id })
|
|
778
833
|
|
|
779
|
-
|
|
780
|
-
|
|
834
|
+
//nDeleted
|
|
835
|
+
let nDeleted = get(r, 'deletedCount', 0)
|
|
781
836
|
|
|
782
|
-
|
|
783
|
-
|
|
837
|
+
//rest, 未命中時nDeleted為0, 屬正常結果
|
|
838
|
+
rest = {
|
|
839
|
+
n: nDeleted,
|
|
840
|
+
nDeleted,
|
|
841
|
+
ok: 1,
|
|
842
|
+
}
|
|
784
843
|
|
|
785
|
-
//rest, 未命中時nDeleted為0, 屬正常結果
|
|
786
|
-
rest = {
|
|
787
|
-
n: nDeleted,
|
|
788
|
-
nDeleted,
|
|
789
|
-
ok: 1,
|
|
790
844
|
}
|
|
845
|
+
catch (err) {
|
|
791
846
|
|
|
792
|
-
|
|
793
|
-
catch (err) {
|
|
847
|
+
//本筆失敗不中斷整批
|
|
794
848
|
|
|
795
|
-
|
|
849
|
+
//rest
|
|
850
|
+
rest = {
|
|
851
|
+
n: 1,
|
|
852
|
+
nDeleted: 0,
|
|
853
|
+
ok: 0,
|
|
854
|
+
err: getErrMsg(err),
|
|
855
|
+
}
|
|
796
856
|
|
|
797
|
-
//rest
|
|
798
|
-
rest = {
|
|
799
|
-
n: 1,
|
|
800
|
-
nDeleted: 0,
|
|
801
|
-
ok: 0,
|
|
802
|
-
err: genErrMsg(err),
|
|
803
857
|
}
|
|
804
858
|
|
|
805
859
|
}
|
|
806
860
|
|
|
861
|
+
//emit, 逐筆失敗須於該筆結果定案後發出, 每筆一次
|
|
862
|
+
if (rest.ok === 0) {
|
|
863
|
+
emitError('del', [v], rest.err)
|
|
864
|
+
}
|
|
865
|
+
|
|
807
866
|
return rest
|
|
808
867
|
})
|
|
809
868
|
|
|
@@ -822,7 +881,12 @@ function WOrmMongodb(opt = {}) {
|
|
|
822
881
|
emitChange('del', data, res)
|
|
823
882
|
}
|
|
824
883
|
|
|
884
|
+
//check
|
|
825
885
|
if (isErr) {
|
|
886
|
+
|
|
887
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
888
|
+
emitError('del', data, res)
|
|
889
|
+
|
|
826
890
|
return Promise.reject(res)
|
|
827
891
|
}
|
|
828
892
|
return res
|
|
@@ -879,7 +943,12 @@ function WOrmMongodb(opt = {}) {
|
|
|
879
943
|
emitChange('delAll', null, res)
|
|
880
944
|
}
|
|
881
945
|
|
|
946
|
+
//check
|
|
882
947
|
if (isErr) {
|
|
948
|
+
|
|
949
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
950
|
+
emitError('delAll', null, res)
|
|
951
|
+
|
|
883
952
|
return Promise.reject(res)
|
|
884
953
|
}
|
|
885
954
|
return res
|
|
@@ -984,7 +1053,12 @@ function WOrmMongodb(opt = {}) {
|
|
|
984
1053
|
emitChange('insertGfs', data, res)
|
|
985
1054
|
}
|
|
986
1055
|
|
|
1056
|
+
//check
|
|
987
1057
|
if (isErr) {
|
|
1058
|
+
|
|
1059
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
1060
|
+
emitError('insertGfs', data, res)
|
|
1061
|
+
|
|
988
1062
|
return Promise.reject(res)
|
|
989
1063
|
}
|
|
990
1064
|
return res
|
|
@@ -1089,13 +1163,19 @@ function WOrmMongodb(opt = {}) {
|
|
|
1089
1163
|
client = null
|
|
1090
1164
|
}
|
|
1091
1165
|
|
|
1166
|
+
//check, 查無檔案已於catch內判定為正常結果而未設isErr, 故不會誤發error事件
|
|
1092
1167
|
if (isErr) {
|
|
1168
|
+
|
|
1169
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
1170
|
+
emitError('selectByPkGfs', null, res)
|
|
1171
|
+
|
|
1093
1172
|
return Promise.reject(res)
|
|
1094
1173
|
}
|
|
1095
1174
|
return res
|
|
1096
1175
|
}
|
|
1097
1176
|
|
|
1098
1177
|
|
|
1178
|
+
//_findGfs, 內部查找函數, 其reject由delGfs與delAllGfs之catch接住並於該處發出error事件, 故本函數不自行發出
|
|
1099
1179
|
async function _findGfs(find = {}, bucket) {
|
|
1100
1180
|
let isErr = false
|
|
1101
1181
|
|
|
@@ -1169,54 +1249,65 @@ function WOrmMongodb(opt = {}) {
|
|
|
1169
1249
|
//id, delGfs不補值, 未帶有效id者視為本筆無法處理
|
|
1170
1250
|
let id = get(v, 'id')
|
|
1171
1251
|
|
|
1252
|
+
//rest
|
|
1253
|
+
let rest = null
|
|
1254
|
+
|
|
1172
1255
|
//check, 判定基準與del一致
|
|
1173
1256
|
if (!isestr(id)) {
|
|
1174
|
-
|
|
1257
|
+
|
|
1258
|
+
//rest
|
|
1259
|
+
rest = {
|
|
1175
1260
|
n: 0,
|
|
1176
1261
|
nDeleted: 0,
|
|
1177
1262
|
ok: 0,
|
|
1178
1263
|
err: `invalid id[${id}]`,
|
|
1179
1264
|
}
|
|
1265
|
+
|
|
1180
1266
|
}
|
|
1267
|
+
else {
|
|
1181
1268
|
|
|
1182
|
-
|
|
1183
|
-
let rest = null
|
|
1269
|
+
try {
|
|
1184
1270
|
|
|
1185
|
-
|
|
1271
|
+
//_findGfs
|
|
1272
|
+
let ltdt = await _findGfs({ filename: id }, bucket)
|
|
1186
1273
|
|
|
1187
|
-
|
|
1188
|
-
|
|
1274
|
+
//delete, 建立唯一索引後同一id至多一筆,
|
|
1275
|
+
//既有數據若尚存重複id則一併刪除並如實回報nDeleted
|
|
1276
|
+
let nDeleted = 0
|
|
1277
|
+
for (let vv of ltdt) {
|
|
1278
|
+
await bucket.delete(vv._id)
|
|
1279
|
+
nDeleted++
|
|
1280
|
+
}
|
|
1189
1281
|
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
}
|
|
1282
|
+
//rest, n為命中與否, 未命中時兩者皆為0且屬正常結果
|
|
1283
|
+
rest = {
|
|
1284
|
+
n: nDeleted > 0 ? 1 : 0,
|
|
1285
|
+
nDeleted,
|
|
1286
|
+
ok: 1,
|
|
1287
|
+
}
|
|
1197
1288
|
|
|
1198
|
-
//rest, n為命中與否, 未命中時兩者皆為0且屬正常結果
|
|
1199
|
-
rest = {
|
|
1200
|
-
n: nDeleted > 0 ? 1 : 0,
|
|
1201
|
-
nDeleted,
|
|
1202
|
-
ok: 1,
|
|
1203
1289
|
}
|
|
1290
|
+
catch (err) {
|
|
1204
1291
|
|
|
1205
|
-
|
|
1206
|
-
catch (err) {
|
|
1292
|
+
//本筆失敗不中斷整批
|
|
1207
1293
|
|
|
1208
|
-
|
|
1294
|
+
//rest
|
|
1295
|
+
rest = {
|
|
1296
|
+
n: 1,
|
|
1297
|
+
nDeleted: 0,
|
|
1298
|
+
ok: 0,
|
|
1299
|
+
err: getErrMsg(err),
|
|
1300
|
+
}
|
|
1209
1301
|
|
|
1210
|
-
//rest
|
|
1211
|
-
rest = {
|
|
1212
|
-
n: 1,
|
|
1213
|
-
nDeleted: 0,
|
|
1214
|
-
ok: 0,
|
|
1215
|
-
err: genErrMsg(err),
|
|
1216
1302
|
}
|
|
1217
1303
|
|
|
1218
1304
|
}
|
|
1219
1305
|
|
|
1306
|
+
//emit, 逐筆失敗須於該筆結果定案後發出, 每筆一次
|
|
1307
|
+
if (rest.ok === 0) {
|
|
1308
|
+
emitError('delGfs', [v], rest.err)
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1220
1311
|
return rest
|
|
1221
1312
|
})
|
|
1222
1313
|
|
|
@@ -1235,7 +1326,12 @@ function WOrmMongodb(opt = {}) {
|
|
|
1235
1326
|
emitChange('delGfs', data, res)
|
|
1236
1327
|
}
|
|
1237
1328
|
|
|
1329
|
+
//check
|
|
1238
1330
|
if (isErr) {
|
|
1331
|
+
|
|
1332
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
1333
|
+
emitError('delGfs', data, res)
|
|
1334
|
+
|
|
1239
1335
|
return Promise.reject(res)
|
|
1240
1336
|
}
|
|
1241
1337
|
return res
|
|
@@ -1315,7 +1411,12 @@ function WOrmMongodb(opt = {}) {
|
|
|
1315
1411
|
emitChange('delAllGfs', null, res)
|
|
1316
1412
|
}
|
|
1317
1413
|
|
|
1414
|
+
//check
|
|
1318
1415
|
if (isErr) {
|
|
1416
|
+
|
|
1417
|
+
//emit, 整批性錯誤須於reject之前發出
|
|
1418
|
+
emitError('delAllGfs', null, res)
|
|
1419
|
+
|
|
1319
1420
|
return Promise.reject(res)
|
|
1320
1421
|
}
|
|
1321
1422
|
return res
|
|
@@ -1354,7 +1455,7 @@ export default WOrmMongodb
|
|
|
1354
1455
|
<br class="clear">
|
|
1355
1456
|
|
|
1356
1457
|
<footer>
|
|
1357
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026
|
|
1458
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026 09:16:25 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
1358
1459
|
</footer>
|
|
1359
1460
|
|
|
1360
1461
|
<script>prettyPrint();</script>
|
package/docs/index.html
CHANGED
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
<br class="clear">
|
|
72
72
|
|
|
73
73
|
<footer>
|
|
74
|
-
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026
|
|
74
|
+
Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 4.0.5</a> on Mon Aug 17 2026 09:16:25 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
|
|
75
75
|
</footer>
|
|
76
76
|
|
|
77
77
|
<script>prettyPrint();</script>
|