场景指南

当你已经知道要启用哪项能力,但需要最小配置、关键参数和排障入口时,从这些指南开始。

连接 MongoDB

import MonSQLize from 'monsqlize';

const msq = new MonSQLize({
    type: 'mongodb',
    databaseName: 'app',
    config: { uri: 'mongodb://127.0.0.1:27017' },
});

await msq.connect();

const users = msq.collection('users');
await users.insertOne({ name: 'Ada', createdAt: new Date() });

await msq.close();
参数是否必填作用
type当前 runtime adapter 是 MongoDB;需要显式声明时写 mongodb
databaseNamecollection()model() 默认使用的数据库。
config.uriMongoDB 连接字符串。

如果失败,先看缺少 config.uri 时的 INVALID_CONFIG,以及 connect() 前访问集合时的 NOT_CONNECTED

示例源码:examples/quick-start/basic-connect.ts

开启内存缓存

import MonSQLize from 'monsqlize';

const msq = new MonSQLize({
    type: 'mongodb',
    databaseName: 'app',
    config: { uri: 'mongodb://127.0.0.1:27017' },
    cache: {
        enabled: true,
        ttl: 60_000,
        maxEntries: 5_000,
        enableStats: true,
    },
});

await msq.connect();
参数是否必填作用
cache.enabled设置为 false 可关闭从该配置块创建缓存。
cache.ttl / cache.defaultTtlruntime 创建缓存条目时使用的默认 TTL,单位毫秒。
cache.maxEntries内存缓存最大条目数。
cache.enableStats开启命中/未命中统计。

内存缓存不需要额外服务,适合单进程或本地快速验证。写入会失效集合查询缓存;事务内写入会在提交成功后刷新待处理失效。

示例源码:examples/cache/with-cache.ts

开启 Redis 二级缓存与分布式失效

import MonSQLize from 'monsqlize';

const redisUrl = 'redis://127.0.0.1:6379';

const msq = new MonSQLize({
    type: 'mongodb',
    databaseName: 'app',
    config: { uri: 'mongodb://127.0.0.1:27017' },
    cache: {
        memory: { maxEntries: 5_000, ttl: 30_000 },
        redis: { url: redisUrl, timeoutMs: 300 },
        distributed: {
            redisUrl,
            channel: 'app:cache:invalidate',
        },
    },
});

await msq.connect();
参数是否必填作用
cache.memory本地 L1 缓存设置。
cache.redis.url启用 L2 时是Redis 连接,用于远程缓存适配器。
cache.redis.timeoutMs远程缓存操作超时时间。
cache.distributed.redisUrl未传 Redis 实例时是Redis Pub/Sub 连接,用于分布式失效广播。
cache.distributed.redis可替代传入已有 Redis-like 实例。
cache.distributed.channel多实例共享的 Pub/Sub 频道。

如果 L2 缓存和分布式失效使用同一个 Redis 地址,把它放进 redisUrl 变量即可避免字符串重复。runtime 不会从 cache.redis.url 自动推导 cache.distributed.redisUrl;需要显式提供两个值,或给 cache.distributed.redis 传入已有 Redis 实例。

示例源码:examples/docs/cache-multilevel.ts

通过 SSH 隧道连接内网 MongoDB

import MonSQLize from 'monsqlize';

const msq = new MonSQLize({
    type: 'mongodb',
    databaseName: 'app',
    config: {
        uri: 'mongodb://mongo.internal:27017/app',
        ssh: {
            host: 'bastion.example.com',
            username: 'deploy',
            privateKeyPath: '~/.ssh/id_rsa',
        },
    },
});

await msq.connect();
参数是否必填作用
config.uri从 SSH 目标网络可访问的 MongoDB URI。
config.ssh.host跳板机地址。
config.ssh.usernameSSH 用户名。
config.ssh.privateKeyPath通常是使用密钥登录时的私钥路径。

传入 config.ssh 后,monSQLize 会先建立本地隧道,再连接 MongoDB。连接失败时先检查 SSH 凭据,再检查跳板机网络内是否能访问 MongoDB。

相关文档:ssh-tunnel.md

配置多连接池

import MonSQLize from 'monsqlize';

const msq = new MonSQLize({
    type: 'mongodb',
    databaseName: 'app',
    pools: [
        { name: 'primary', uri: 'mongodb://primary:27017/app', role: 'primary' },
        { name: 'analytics', uri: 'mongodb://analytics:27017/app', role: 'analytics', tags: ['reporting'] },
    ],
    poolStrategy: 'auto',
    poolFallback: { enabled: true, fallbackStrategy: 'secondary' },
});

await msq.connect();
const reports = msq.pool('analytics').collection('reports');
参数是否必填作用
pools[].name通过 pool(name) 访问时使用的稳定名称。
pools[].uri该连接池的 MongoDB URI。
pools[].role描述 primary、secondary、analytics、archive 或自定义用途。
poolStrategy连接池路由选择策略。
poolFallback目标池不可用时的回退行为。

连接池配置错误会抛出 INVALID_CONFIG;指定不存在的池会抛出 POOL_NOT_FOUND;所有池不可用会抛出 INVALID_OPERATION

示例源码:examples/docs/pool.tsexamples/docs/multi-pool-health-check.ts

启用 Model 层

import MonSQLize, { Model } from 'monsqlize';

Model.define('users', {
    schema: (s) => s({
        name: 'string:1-64!',
        email: 'email!',
    }),
});

const msq = new MonSQLize({
    type: 'mongodb',
    databaseName: 'app',
    config: { uri: 'mongodb://127.0.0.1:27017' },
});

await msq.connect();
const User = msq.model('users');
await User.insertOne({ name: 'Ada', email: 'ada@example.com' });
参数是否必填作用
Model.define(name, config)在 runtime 绑定前注册 Model 定义。
schema: (s) => s(...)通常是当前推荐的 schema 回调写法。
schemaDsl配置 runtime options、extensions、外部 runtime 或显式关闭验证。
writePathPolicy某些命名空间必须经过 Model 写入时使用 model-only

Model 的 schema 回调使用当前 MonSQLize 实例隔离的 schema-dsl/runtime。如果应用持有自定义 schema-dsl 类型或消息,应直接配置该 runtime,并通过 schemaDsl: { runtime } 注入。

示例源码:examples/docs/model.ts

按错误码排障

import { ErrorCodes } from 'monsqlize';

try {
    await msq.connect();
} catch (error) {
    const code = (error as { code?: string }).code;
    if (code === ErrorCodes.INVALID_CONFIG) {
        console.error('检查 MonSQLize 构造配置');
    } else if (code === ErrorCodes.CONNECTION_FAILED) {
        console.error('检查 MongoDB 网络、认证和 URI');
    } else {
        throw error;
    }
}
错误码常见原因先检查
INVALID_CONFIG构造参数或功能配置块缺失/格式错误MonSQLize 构造参数和对应功能配置
CONNECTION_FAILEDMongoDB 或 SSH 连接失败网络、认证、URI、SSH 隧道可达性
NOT_CONNECTEDconnect() 前使用数据 APIruntime 生命周期
POOL_NOT_FOUND池名称不存在pools[].namemsq.pool(name)

更多错误码与处理建议见 error-codes.md