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.
@@ -45,8 +45,7 @@
45
45
 
46
46
  <section>
47
47
  <article>
48
- <pre class="prettyprint source linenums"><code>import events from 'events'
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 genID from 'wsemi/src/genID.mjs'
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
- let ee = new events.EventEmitter()
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 genErrMsg(err) {
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
- //genID
182
- v.id = genID()
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: genErrMsg(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
- return {
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
- //rest
775
- let rest = null
829
+ try {
776
830
 
777
- try {
831
+ //deleteOne
832
+ let r = await collection.deleteOne({ id })
778
833
 
779
- //deleteOne
780
- let r = await collection.deleteOne({ id })
834
+ //nDeleted
835
+ let nDeleted = get(r, 'deletedCount', 0)
781
836
 
782
- //nDeleted
783
- let nDeleted = get(r, 'deletedCount', 0)
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
- return {
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
- //rest
1183
- let rest = null
1269
+ try {
1184
1270
 
1185
- try {
1271
+ //_findGfs
1272
+ let ltdt = await _findGfs({ filename: id }, bucket)
1186
1273
 
1187
- //_findGfs
1188
- let ltdt = await _findGfs({ filename: id }, bucket)
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
- //delete, 建立唯一索引後同一id至多一筆,
1191
- //既有數據若尚存重複id則一併刪除並如實回報nDeleted
1192
- let nDeleted = 0
1193
- for (let vv of ltdt) {
1194
- await bucket.delete(vv._id)
1195
- nDeleted++
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 07:33:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
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 07:33:48 GMT+0800 (台北標準時間) using the <a href="https://github.com/clenemt/docdash">docdash</a> theme.
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>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "w-orm-mongodb",
3
- "version": "1.1.40",
3
+ "version": "1.1.42",
4
4
  "main": "dist/w-orm-mongodb.umd.js",
5
5
  "dependencies": {
6
6
  "mongodb": "^7.5.0",