gpt4 book ai didi

node.js - Mongoose:使用 npm/node_modules 模块提供的模型或模式

转载 作者:可可西里 更新时间:2023-11-01 09:17:23 24 4
gpt4 key购买 nike

假设我有一个应用程序,它定义了一些模型并创建了全局 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);

还有其他选择吗?

非常感谢。

最佳答案

我通过修改模式原型(prototype)来使用 mongoose.Schema 的正确实例来解决这个问题,这样它将通过内部 Mongoose instanceof 检查。所以对于你的例子,我会添加这样一行:

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

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

关于node.js - Mongoose:使用 npm/node_modules 模块提供的模型或模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14526823/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com