monsqlize 1.1.1 → 1.1.2

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/CHANGELOG.md CHANGED
@@ -9,6 +9,7 @@
9
9
 
10
10
  | 版本 | 日期 | 变更摘要 | 详细 |
11
11
  |------|------|---------|------|
12
+ | [v1.1.2](#v112---日志优化) | 2026-01-27 | 🔧 优化:ObjectId 转换日志默认静默 + Saga 日志修复 | [查看](#v112---日志优化) |
12
13
  | [v1.1.1](#v111---objectid-跨版本兼容) | 2026-01-27 | 🔧 Bug修复:新增跨版本 ObjectId 兼容性(支持 mongoose bson@4.x/5.x)| [查看](#v111---objectid-跨版本兼容) |
13
14
  | [v1.1.0](./changelogs/v1.1.0.md) | 2026-01-21 | 🎉 重大更新:新增49个操作符,实现100% MongoDB操作符支持(122/122)| [查看](./changelogs/v1.1.0.md) |
14
15
  | [v1.0.9](./changelogs/v1.0.9.md) | 2026-01-19 | 🎉 重大功能:统一表达式系统 - 67个操作符 + 107个测试 (100%通过) | [查看](./changelogs/v1.0.9.md) |
@@ -34,6 +35,74 @@
34
35
 
35
36
  ## 里程碑版本
36
37
 
38
+ ### v1.1.2 - 日志优化 🔧
39
+
40
+ **发布日期**: 2026-01-27
41
+ **重要性**: ⭐⭐⭐
42
+
43
+ **优化内容**:
44
+
45
+ 1. **ObjectId 转换日志默认静默**
46
+ - ✅ **默认完全静默**: 不输出任何 ObjectId 转换日志
47
+ - ✅ **用户反馈驱动**: 根据用户反馈,转换日志无实际作用
48
+ - ✅ **可选启用**: 支持按需启用摘要或详细日志
49
+ - ✅ **生产友好**: 减少日志量,避免日志污染
50
+
51
+ 2. **Saga 日志修复**
52
+ - ✅ **修复误导性日志**: 正确区分内存缓存和 Redis 缓存
53
+ - ✅ **准确识别**: 通过检测 `cache.keys` 和 `cache.publish` 方法识别 Redis
54
+ - ✅ **日志准确**: 内存缓存显示"使用内存缓存",Redis 显示"使用 Redis 存储"
55
+
56
+ **配置选项**:
57
+
58
+ ```javascript
59
+ // 默认配置(完全静默)
60
+ const msq = new MonSQLize({
61
+ type: 'mongodb',
62
+ config: { uri: 'mongodb://localhost:27017' }
63
+ });
64
+ // ✅ 无任何 ObjectId 转换日志
65
+
66
+ // 启用摘要日志(调试用)
67
+ const msq = new MonSQLize({
68
+ type: 'mongodb',
69
+ config: { uri: 'mongodb://localhost:27017' },
70
+ autoConvertObjectId: {
71
+ silent: false // 关闭静默
72
+ }
73
+ });
74
+ // 输出:[DEBUG] Converted 15 cross-version ObjectIds
75
+
76
+ // 启用详细日志(深度调试)
77
+ const msq = new MonSQLize({
78
+ type: 'mongodb',
79
+ config: { uri: 'mongodb://localhost:27017' },
80
+ autoConvertObjectId: {
81
+ silent: false,
82
+ verbose: true
83
+ }
84
+ });
85
+ // 输出:每个 ObjectId 都有一条日志
86
+ ```
87
+
88
+ **效果对比**:
89
+
90
+ | 模式 | silent | verbose | 日志输出 | 适用场景 |
91
+ |------|--------|---------|---------|---------|
92
+ | **静默模式**(默认)✅ | `true` | - | 无 | 生产环境、日常开发 |
93
+ | **摘要模式** | `false` | `false` | 1条摘要 | 需要了解转换情况时 |
94
+ | **详细模式** | `false` | `true` | N条详情 | 深度调试、排查问题 |
95
+
96
+ **修改的文件**:
97
+ - `lib/utils/objectid-converter.js`: 添加 `silent` 配置,默认 `true`
98
+ - `lib/saga/SagaOrchestrator.js`: 修复 Redis 识别逻辑
99
+
100
+ **详细文档**:
101
+ - [ObjectId 日志配置](./docs/objectid-logging-optimization.md)
102
+ - [FAQ - Q3: 如何关闭日志](./docs/objectid-cross-version-faq.md#q3)
103
+
104
+ ---
105
+
37
106
  ### v1.1.1 - ObjectId 跨版本兼容 🔧
38
107
 
39
108
  **发布日期**: 2026-01-27
@@ -123,9 +123,16 @@ function convertObjectIdStrings(obj, fieldPath = '', depth = 0, visited = new We
123
123
  logger = null,
124
124
  excludeFields = [],
125
125
  customFieldPatterns = [],
126
- maxDepth = 10
126
+ maxDepth = 10,
127
+ verbose = false, // 详细日志模式(默认关闭)
128
+ silent = true, // 🆕 静默模式(默认开启,不输出任何日志)
129
+ _conversionStats = null // 内部统计对象(递归传递)
127
130
  } = options;
128
131
 
132
+ // 初始化统计(仅在顶层调用)
133
+ const stats = _conversionStats || { count: 0, fields: [] };
134
+ const isTopLevel = depth === 0 && !_conversionStats;
135
+
129
136
  try {
130
137
  // 1. 深度保护(防止栈溢出)
131
138
  if (depth > maxDepth) {
@@ -157,7 +164,15 @@ function convertObjectIdStrings(obj, fieldPath = '', depth = 0, visited = new We
157
164
  const hexString = obj.toString();
158
165
  if (isValidObjectIdString(hexString)) {
159
166
  const converted = new ObjectId(hexString);
160
- if (logger && logger.debug) {
167
+
168
+ // 更新统计
169
+ stats.count++;
170
+ if (stats.fields.length < 5) { // 只记录前5个字段路径
171
+ stats.fields.push(fieldPath);
172
+ }
173
+
174
+ // 详细模式:每次转换都输出日志(仅在非静默模式下)
175
+ if (!silent && verbose && logger && logger.debug) {
161
176
  logger.debug('[ObjectId Converter] Cross-version ObjectId converted', {
162
177
  from: obj.constructor.name,
163
178
  to: 'ObjectId',
@@ -165,6 +180,7 @@ function convertObjectIdStrings(obj, fieldPath = '', depth = 0, visited = new We
165
180
  fieldPath
166
181
  });
167
182
  }
183
+
168
184
  return converted;
169
185
  }
170
186
  } catch (error) {
@@ -212,7 +228,10 @@ function convertObjectIdStrings(obj, fieldPath = '', depth = 0, visited = new We
212
228
  let hasConverted = false;
213
229
  const converted = obj.map((item, index) => {
214
230
  const itemPath = `${fieldPath}[${index}]`;
215
- const newItem = convertObjectIdStrings(item, itemPath, depth + 1, visited, options);
231
+ const newItem = convertObjectIdStrings(item, itemPath, depth + 1, visited, {
232
+ ...options,
233
+ _conversionStats: stats // 传递统计对象
234
+ });
216
235
  if (newItem !== item) {
217
236
  hasConverted = true;
218
237
  }
@@ -276,7 +295,10 @@ function convertObjectIdStrings(obj, fieldPath = '', depth = 0, visited = new We
276
295
  }
277
296
  } else {
278
297
  // 6.5 递归处理
279
- const newValue = convertObjectIdStrings(value, currentPath, depth + 1, visited, options);
298
+ const newValue = convertObjectIdStrings(value, currentPath, depth + 1, visited, {
299
+ ...options,
300
+ _conversionStats: stats // 传递统计对象
301
+ });
280
302
  if (newValue !== value) {
281
303
  hasConverted = true;
282
304
  }
@@ -302,6 +324,18 @@ function convertObjectIdStrings(obj, fieldPath = '', depth = 0, visited = new We
302
324
  }
303
325
  // 异常时返回原值,确保不中断流程
304
326
  return obj;
327
+ } finally {
328
+ // 顶层调用:输出转换摘要(仅在非静默模式且有转换时)
329
+ if (!silent && isTopLevel && stats.count > 0 && logger && logger.debug) {
330
+ const message = stats.count === 1
331
+ ? 'Converted 1 cross-version ObjectId'
332
+ : `Converted ${stats.count} cross-version ObjectIds`;
333
+
334
+ logger.debug(`[ObjectId Converter] ${message}`, {
335
+ count: stats.count,
336
+ sampleFields: stats.fields.slice(0, 3) // 只显示前3个字段示例
337
+ });
338
+ }
305
339
  }
306
340
  }
307
341
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "monsqlize",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "A lightweight MongoDB ORM with multi-level caching, transaction support, distributed features, Saga distributed transactions, and unified expression system with 122 operators (100% MongoDB support)",
5
5
  "main": "lib/index.js",
6
6
  "module": "index.mjs",