express-restify-mongoose 动态模型进阶:如何用 modelFactory 实现每请求切换 Mongoose Model
发布时间:2026/8/24 9:16:28 作者:尧图编辑部 阅读量:1,286

express-restify-mongoose 动态模型进阶如何用 modelFactory 实现每请求切换 Mongoose Model【免费下载链接】express-restify-mongooseEasily restify mongoose databases项目地址: https://gitcode.com/gh_mirrors/ex/express-restify-mongooseexpress-restify-mongoose 是一个只需一行代码就能把 Mongoose 模型变成 RESTful API 的 Node.js 库而它的modelFactory选项更是一个隐藏的进阶利器每个请求都可以动态切换背后使用的 Mongoose Model天然适配多租户、按租户隔离数据等 SaaS 场景。为什么需要每请求切换模型 默认用法是把一个固定的 Model 交给serve此后所有增删改查都操作这个模型。但在多租户系统里常见的需求是同一套 REST 接口不同租户的数据存放在不同的数据库或集合中根据请求头、Token 中的租户标识把请求路由到对应的模型灰度发布、读写分离等需要动态选择数据源的场景。静态模型显然无法胜任。express-restify-mongoose 提供了两种进阶手段定位不同进阶手段作用粒度适用场景contextFilter同一模型上动态加查询条件行级权限、数据过滤modelFactory整个 Mongoose Model含数据库/集合/Schema租户隔离、动态路由数据源本文聚焦modelFactory。30 秒上手一行配置实现动态切换给serve传入modelFactory选项即可serve(app, BaseCustomerModel, { name: Customer, modelFactory: { // getModel 接收 Express 的 req支持同步或异步 getModel: (req) { const tenantId req.headers[x-tenant-id]; return tenants[tenantId].customerModel; // 返回目标租户的模型 } } });配置之后GET/POST/PATCH/DELETE /api/v1/Customer的所有 CRUD 路由都会自动对getModel返回的模型执行操作无需再写任何路由代码。原理揭秘每请求的模型是从哪来的 serve注册路由时会优先注入一个内部中间件把取模型这件事交给modelFactory见 src/express-restify-mongoose.tsconst modelMiddleware async (req, res, next) { const getModel serveOptions?.modelFactory?.getModel; req.erm { model: typeof getModel function ? await getModel(req) : model, }; next(); };从源码能读出三个关键设计每个请求只调用一次getModel且内置await所以它是一等公民的异步函数——可以先查询鉴权服务再返回对应模型结果挂载在req.erm.model后续所有中间件查询解析、访问控制等都从这里读取完全向后兼容不传modelFactory时req.erm.model直接回退为serve传入的静态模型。选项的类型定义见 src/types.tsmodelFactory?: { getModel: (req: Request) mongoose.Modelunknown; };所有数据操作都从req.erm.model读取模型。以列表查询为例见 src/operations.ts如果模型为空会直接返回错误避免请求静默地落到错误的集合上。实战避坑3 个实用提示 getModel可以异步推荐用async函数在内部完成租户识别、数据库连接选择再return对应模型链路完全无阻塞。不要返回 undefined如果getModel返回空值请求会立刻以Model is undefined.报错见 src/operations.ts。建议找不到租户时返回兜底模型或结合access选项抛 403。留意基座模型的固有逻辑serve注册时会扫描传入模型基座模型的 schema 字段权限private/protected并基于它注册过滤规则见 src/express-restify-mongoose.ts。若各租户模型字段命名差异较大建议统一 schema只切换数据库/集合行为最稳定。另外contextFilter与modelFactory可以叠加使用先用modelFactory选中租户模型再用contextFilter在模型上做行级过滤参考 test/integration/contextFilter.mjs 的写法。总结express-restify-mongoose 的modelFactory是一个一行配置级别的进阶能力给serve传一个getModel(req)函数即可实现每请求切换 Mongoose Model。它与contextFilter、req.erm请求上下文配合能帮你在 Mongoose 上快速搭建出支持多租户、动态路由的灵活 REST 接口。想动手试试安装npm install express-restify-mongoose后可参考 examples/invoicing.js 这个完整 REST 服务示例快速起步。【免费下载链接】express-restify-mongooseEasily restify mongoose databases项目地址: https://gitcode.com/gh_mirrors/ex/express-restify-mongoose创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考