【问题标题】:Mongoose: Using model or schema provided by a module from npm/node_modulesMongoose:使用来自 npm/node_modules 的模块提供的模型或模式
【发布时间】:2013-01-09 17:06:45
【问题描述】:

假设我有一个应用程序,它定义了几个模型并创建了全局 Mongoose 连接 (mongoose.connect(...))。该应用程序还依赖于node_modules 目录中的模块定义的一些模型。我遇到的问题是应用程序和单独的模块不共享同一个全局连接对象。

好的,好的。与其让模块导出模型,不如只导出模式,主应用程序可以将其注册到连接中。在应用程序中会有类似的内容:

var SomeSchema = require('somemodule').SomeSchema;
mongoose.model('SomeModel', SomeSchema);

不幸的是,这也不起作用。注册模型时,Mongoose 会检查给定模式是否是 mongoose.Schema (here) 的实例。当SomeSchema 被定义(在单独的模块中)时,它使用new mongoose.Schema({ ... }) 创建模式,其中模块的本地依赖树需要mongoose。当应用程序注册模式时,它使用应用程序依赖项所需的mongoose。由于 mongoose 的两个副本不是同一个对象,因此给定架构不是 mongoose.Schema 的实例,因此会引发错误。

你有什么建议吗?我在想一个潜在的解决方案是让模块创建一个接受模式并添加所有路径、方法等的“插件”函数。主应用程序将创建一个空模式并添加插件。比如:

var somePlugin = require('somemodule').somePlugin;
var SomeSchema = new mongoose.Schema();
SomeSchema.plugin(somePlugin);
mongoose.model('SomeModel', SomeSchema);

还有其他选择吗?

非常感谢。

【问题讨论】:

  • 你真正想要什么。?您只需将所有架构放在项目组织的不同文件中..?
  • 我想跨多个项目/应用重用 NPM 模块提供的模型。

标签: node.js mongodb mongoose


【解决方案1】:

我通过破解模式原型以使用mongoose.Schema 的正确实例解决了这个问题,以便它通过内部Mongoose instanceof 检查。因此,对于您的示例,我将添加如下一行:

var SomeSchema = require('somemodule').SomeSchema;
SomeSchema.__proto__ = mongoose.Schema.prototype;
mongoose.model('SomeModel', SomeSchema);

这当然不是犹太洁食,但它对我有用!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-10
    • 2019-05-23
    • 2012-01-28
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    相关资源
    最近更新 更多