monsqlize 1.1.7 → 1.1.9
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 +3 -1
- package/README.md +24 -0
- package/lib/connect.js +99 -99
- package/lib/index.js +941 -856
- package/lib/model/index.js +1110 -956
- package/lib/multi-level-cache.js +39 -8
- package/lib/redis-cache-adapter.js +29 -0
- package/package.json +1 -1
- package/types/collection.ts +357 -357
- package/types/model/instance.ts +92 -67
package/CHANGELOG.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# 变更日志 (CHANGELOG)
|
|
2
2
|
|
|
3
3
|
> **说明**: 版本概览摘要,详细变更见 [changelogs/](./changelogs/) 目录
|
|
4
|
-
> **最后更新**: 2026-02
|
|
4
|
+
> **最后更新**: 2026-04-02
|
|
5
5
|
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
| 版本 | 日期 | 变更摘要 | 详细 |
|
|
11
11
|
|------|------|---------|------|
|
|
12
|
+
| [v1.1.9](./changelogs/v1.1.9.md) | 2026-04-02 | 🚨 **P1 Bug 修复**:MultiLevelCache L2→L1 回填 TTL 缺失(null 永久驻留 L1)+ 新增 `backfillLocalTTL` 配置 + Redis `getWithTTL` 方法 + 14 个回归测试 | [查看](./changelogs/v1.1.9.md) |
|
|
13
|
+
| [v1.1.8](./changelogs/v1.1.8.md) | 2026-03-16 | 🆕 **新功能**:Model 热重载支持(`undefine()` + `redefine()` + `_loadModels` reload 模式)+ 22个测试 (100%通过) | [查看](./changelogs/v1.1.8.md) |
|
|
12
14
|
| [v1.1.6](./changelogs/v1.1.6.md) | 2026-02-11 | 🎉 **重大功能**:精准缓存失效机制 + 🚨 upsert 缓存失效 Bug 修复 + 36个测试 (100%通过) | [查看](./changelogs/v1.1.6.md) |
|
|
13
15
|
| [v1.1.4](./changelogs/v1.1.4.md) | 2026-02-09 | 🎉 重大功能:通用函数缓存 - 52个测试 (100%通过) + 多层缓存 delPattern 修复 | [查看](./changelogs/v1.1.4.md) |
|
|
14
16
|
| [v1.1.3](./changelogs/v1.1.3.md) | 2026-02-03 | 📚 文档完善:多连接池文档优化 + 健康检查详解 + 验证体系规范 | [查看](./changelogs/v1.1.3.md) |
|
package/README.md
CHANGED
|
@@ -1242,6 +1242,30 @@ const user = await User.findOne({ username: 'john' })
|
|
|
1242
1242
|
npm install schema-dsl
|
|
1243
1243
|
```
|
|
1244
1244
|
|
|
1245
|
+
#### 热重载支持(v1.1.7+)🆕
|
|
1246
|
+
|
|
1247
|
+
在开发模式下,无需重启进程即可更新 Model 定义。
|
|
1248
|
+
|
|
1249
|
+
```javascript
|
|
1250
|
+
const { Model } = require('monsqlize');
|
|
1251
|
+
|
|
1252
|
+
// 注销 Model 定义(返回 boolean)
|
|
1253
|
+
Model.undefine('users'); // true — 成功注销
|
|
1254
|
+
Model.undefine('nonexistent'); // false — 不存在时不抛错
|
|
1255
|
+
|
|
1256
|
+
// 替换 Model 定义(undefine + define 的组合)
|
|
1257
|
+
Model.redefine('users', {
|
|
1258
|
+
schema: (dsl) => dsl({ username: 'string!', email: 'email!' })
|
|
1259
|
+
});
|
|
1260
|
+
|
|
1261
|
+
// 批量热重载(重新加载所有 model 文件)
|
|
1262
|
+
await msq._loadModels({ reload: true });
|
|
1263
|
+
```
|
|
1264
|
+
|
|
1265
|
+
**注意事项**:
|
|
1266
|
+
- `redefine()` 若新定义校验失败,旧定义**已被移除**(不会回滚),调用方需 try/catch
|
|
1267
|
+
- 已实例化的 `ModelInstance` 不受影响,热重载后应通过 `db.model()` 重新获取实例
|
|
1268
|
+
|
|
1245
1269
|
[📖 Model 层详细文档](./docs/model.md)
|
|
1246
1270
|
|
|
1247
1271
|
---
|
package/lib/connect.js
CHANGED
|
@@ -1,99 +1,99 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* 数据库连接管理器
|
|
3
|
-
* 统一管理各种数据库的连接创建和实例化逻辑
|
|
4
|
-
*/
|
|
5
|
-
const Mongo = require("./mongodb");
|
|
6
|
-
|
|
7
|
-
module.exports = class ConnectionManager {
|
|
8
|
-
/**
|
|
9
|
-
* 支持的数据库类型映射
|
|
10
|
-
*/
|
|
11
|
-
static get SUPPORTED_DATABASES() {
|
|
12
|
-
return {
|
|
13
|
-
mongodb: Mongo,
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
/**
|
|
18
|
-
* 创建数据库实例
|
|
19
|
-
* @param {string} type - 数据库类型
|
|
20
|
-
* @param {string} databaseName - 数据库名称
|
|
21
|
-
* @param {Object} cache - 缓存实例(内存缓存)
|
|
22
|
-
* @param {Object} logger - 日志记录器
|
|
23
|
-
* @param {Object} [defaults] - 统一默认配置(如 maxTimeMS、namespace)
|
|
24
|
-
* @returns {Object} 数据库实例
|
|
25
|
-
* @throws {Error} 当数据库类型不支持或未实现时抛出错误
|
|
26
|
-
*/
|
|
27
|
-
static createInstance(type, databaseName, cache, logger, defaults) {
|
|
28
|
-
const SUPPORTED_DATABASES = this.SUPPORTED_DATABASES;
|
|
29
|
-
// 验证数据库类型是否支持
|
|
30
|
-
if (!(type in SUPPORTED_DATABASES)) {
|
|
31
|
-
const supportedTypes = Object.keys(SUPPORTED_DATABASES).join(", ");
|
|
32
|
-
throw new Error(
|
|
33
|
-
`Invalid database type: ${type}. Supported types are: ${supportedTypes}`,
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// 检查是否已实现
|
|
38
|
-
if (SUPPORTED_DATABASES[type] === null) {
|
|
39
|
-
throw new Error(`${type} support not implemented yet`);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// 获取对应的数据库类
|
|
43
|
-
const DatabaseClass = SUPPORTED_DATABASES[type];
|
|
44
|
-
|
|
45
|
-
// 创建并返回实例
|
|
46
|
-
return new DatabaseClass(type, databaseName, cache, logger, defaults);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
* 连接数据库
|
|
51
|
-
* @param {string} type - 数据库类型
|
|
52
|
-
* @param {string} databaseName - 数据库名称
|
|
53
|
-
* @param {Object} config - 数据库连接配置
|
|
54
|
-
* @param {Object} cache - 缓存实例
|
|
55
|
-
* @param {Object} logger - 日志记录器
|
|
56
|
-
* @param {Object} [defaults] - 统一默认配置(如 maxTimeMS、namespace)
|
|
57
|
-
* @param {Object} [poolManager] - 多连接池管理器(v1.0.8+)
|
|
58
|
-
* @returns {{accessor: Function, instance: Object}} 访问器与底层适配器实例
|
|
59
|
-
* @throws {Error} 连接失败时抛出错误
|
|
60
|
-
*/
|
|
61
|
-
static async connect(
|
|
62
|
-
type,
|
|
63
|
-
databaseName,
|
|
64
|
-
config,
|
|
65
|
-
cache,
|
|
66
|
-
logger,
|
|
67
|
-
defaults,
|
|
68
|
-
poolManager,
|
|
69
|
-
) {
|
|
70
|
-
// 创建数据库实例
|
|
71
|
-
const instance = this.createInstance(
|
|
72
|
-
type,
|
|
73
|
-
databaseName,
|
|
74
|
-
cache,
|
|
75
|
-
logger,
|
|
76
|
-
defaults,
|
|
77
|
-
);
|
|
78
|
-
|
|
79
|
-
// 🆕 v1.0.8: 传递 poolManager 给实例
|
|
80
|
-
if (poolManager) {
|
|
81
|
-
instance.poolManager = poolManager;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
// 建立连接
|
|
85
|
-
await instance.connect(config);
|
|
86
|
-
|
|
87
|
-
// ---------- 构建访问器 ----------
|
|
88
|
-
const collection = (collectionName) =>
|
|
89
|
-
instance.collection(databaseName, collectionName);
|
|
90
|
-
const db = (databaseName) => {
|
|
91
|
-
return {
|
|
92
|
-
collection: (collectionName) =>
|
|
93
|
-
instance.collection(databaseName, collectionName),
|
|
94
|
-
};
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
return { collection, db, use: db, instance };
|
|
98
|
-
}
|
|
99
|
-
};
|
|
1
|
+
/**
|
|
2
|
+
* 数据库连接管理器
|
|
3
|
+
* 统一管理各种数据库的连接创建和实例化逻辑
|
|
4
|
+
*/
|
|
5
|
+
const Mongo = require("./mongodb");
|
|
6
|
+
|
|
7
|
+
module.exports = class ConnectionManager {
|
|
8
|
+
/**
|
|
9
|
+
* 支持的数据库类型映射
|
|
10
|
+
*/
|
|
11
|
+
static get SUPPORTED_DATABASES() {
|
|
12
|
+
return {
|
|
13
|
+
mongodb: Mongo,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 创建数据库实例
|
|
19
|
+
* @param {string} type - 数据库类型
|
|
20
|
+
* @param {string} databaseName - 数据库名称
|
|
21
|
+
* @param {Object} cache - 缓存实例(内存缓存)
|
|
22
|
+
* @param {Object} logger - 日志记录器
|
|
23
|
+
* @param {Object} [defaults] - 统一默认配置(如 maxTimeMS、namespace)
|
|
24
|
+
* @returns {Object} 数据库实例
|
|
25
|
+
* @throws {Error} 当数据库类型不支持或未实现时抛出错误
|
|
26
|
+
*/
|
|
27
|
+
static createInstance(type, databaseName, cache, logger, defaults) {
|
|
28
|
+
const SUPPORTED_DATABASES = this.SUPPORTED_DATABASES;
|
|
29
|
+
// 验证数据库类型是否支持
|
|
30
|
+
if (!(type in SUPPORTED_DATABASES)) {
|
|
31
|
+
const supportedTypes = Object.keys(SUPPORTED_DATABASES).join(", ");
|
|
32
|
+
throw new Error(
|
|
33
|
+
`Invalid database type: ${type}. Supported types are: ${supportedTypes}`,
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// 检查是否已实现
|
|
38
|
+
if (SUPPORTED_DATABASES[type] === null) {
|
|
39
|
+
throw new Error(`${type} support not implemented yet`);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// 获取对应的数据库类
|
|
43
|
+
const DatabaseClass = SUPPORTED_DATABASES[type];
|
|
44
|
+
|
|
45
|
+
// 创建并返回实例
|
|
46
|
+
return new DatabaseClass(type, databaseName, cache, logger, defaults);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* 连接数据库
|
|
51
|
+
* @param {string} type - 数据库类型
|
|
52
|
+
* @param {string} databaseName - 数据库名称
|
|
53
|
+
* @param {Object} config - 数据库连接配置
|
|
54
|
+
* @param {Object} cache - 缓存实例
|
|
55
|
+
* @param {Object} logger - 日志记录器
|
|
56
|
+
* @param {Object} [defaults] - 统一默认配置(如 maxTimeMS、namespace)
|
|
57
|
+
* @param {Object} [poolManager] - 多连接池管理器(v1.0.8+)
|
|
58
|
+
* @returns {{accessor: Function, instance: Object}} 访问器与底层适配器实例
|
|
59
|
+
* @throws {Error} 连接失败时抛出错误
|
|
60
|
+
*/
|
|
61
|
+
static async connect(
|
|
62
|
+
type,
|
|
63
|
+
databaseName,
|
|
64
|
+
config,
|
|
65
|
+
cache,
|
|
66
|
+
logger,
|
|
67
|
+
defaults,
|
|
68
|
+
poolManager,
|
|
69
|
+
) {
|
|
70
|
+
// 创建数据库实例
|
|
71
|
+
const instance = this.createInstance(
|
|
72
|
+
type,
|
|
73
|
+
databaseName,
|
|
74
|
+
cache,
|
|
75
|
+
logger,
|
|
76
|
+
defaults,
|
|
77
|
+
);
|
|
78
|
+
|
|
79
|
+
// 🆕 v1.0.8: 传递 poolManager 给实例
|
|
80
|
+
if (poolManager) {
|
|
81
|
+
instance.poolManager = poolManager;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// 建立连接
|
|
85
|
+
await instance.connect(config);
|
|
86
|
+
|
|
87
|
+
// ---------- 构建访问器 ----------
|
|
88
|
+
const collection = (collectionName) =>
|
|
89
|
+
instance.collection(databaseName, collectionName);
|
|
90
|
+
const db = (databaseName) => {
|
|
91
|
+
return {
|
|
92
|
+
collection: (collectionName) =>
|
|
93
|
+
instance.collection(databaseName, collectionName),
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
return { collection, db, use: db, instance };
|
|
98
|
+
}
|
|
99
|
+
};
|