4

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

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

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

不幸的是,这也不起作用。当模型被注册时,Mongoose 会检查给定的模式是否是mongoose.Schema(这里) 的一个实例。当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);

有没有其他选择?

非常感谢。

4

1 回答 1

0

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

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

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

于 2013-08-12T21:07:52.877 回答