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 +69 -0
- package/lib/utils/objectid-converter.js +38 -4
- package/package.json +1 -1
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
|
-
|
|
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,
|
|
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,
|
|
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.
|
|
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",
|