Chr*_*ill 6 model mongoose mongodb node.js
免责声明:我是mongoose/node的新手,所以如果我误解了一些基本的东西,请原谅.是的,我发现已经有一些关于这个主题的帖子,但无法根据我的需求进行调整.
我将主项目组织成多个独立的项目.一个分离是"app-core"项目,它将包含核心模型和模块,由彼此项目注入(app-core在每个项目的package.json文件中配置为依赖项).
app-core中的(简化)模型目前看起来像这样:
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var IndustrySchema = new Schema({
name: {
type: String,
required: true
}
});
module.exports = mongoose.model('Industry', IndustrySchema);
Run Code Online (Sandbox Code Playgroud)
wep-app包括以下模型:
var Industry = require('app-core/models/Industry');
Run Code Online (Sandbox Code Playgroud)
并创建像这样的MongoDB连接:
var DB_URL = 'mongodb://localhost/hellowins';
var mongoose = require('mongoose');
var mongooseClient = mongoose.connect(DB_URL);
mongooseClient.connection.on('connected',function () {
console.log("MongoDB is connected");
});
Run Code Online (Sandbox Code Playgroud)
现在我遇到了问题,模型不会使用app-web项目中定义的mongo连接,而是会考虑在app-core中配置的连接.
由于封装和责任设计,我绝对不希望核心为每个可能的应用程序(可能包括核心应用程序)定义连接.所以我不知何故只需要在核心中指定方案.
我已经读过我不应该要求模型本身(/ app-core/models/Industry),而是使用mongoose模型代替
var Industry = mongoose.model("Industry");
Run Code Online (Sandbox Code Playgroud)
但后来我得到了错误
MissingSchemaError: Schema hasn't been registered for model "Test"
Run Code Online (Sandbox Code Playgroud)
要解决这个问题,我应该手动注册模型,就像在第一个链接中提到的那样(在我发布的顶部).但不知怎的,我不喜欢这种方法,因为每次应用程序使用新模型时我都需要扩展它.
而且即使在核心应用程序中我也需要一个mongo连接 - 至少要运行mocha测试.
所以我对如何在这种情况下构建架构感到困惑.
更新#1
我现在找到了一个有效的解决方 但是,遗憾的是,这并不完全符合我的要求,因为通过钩子扩展模型(即TestSchema.pre('save'..))非常困难(相当丑陋).
模型(app-core)
exports.model = {
name: {
type: String,
required: true
}
};
Run Code Online (Sandbox Code Playgroud)
models.js(app-web,在启动时执行一次)
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var models = ['Test']; // add many
exports.initialize = function() {
var l = models.length;
for (var i = 0; i < l; i++) {
var model = require('hw-core/models/' + models[i]);
var ModelSchema = new Schema(model.model);
module.exports = mongoose.model(models[i], ModelSchema);
}
Run Code Online (Sandbox Code Playgroud)
};
app.js(网络应用)
require('./conf/app_models.js').initialize();
Run Code Online (Sandbox Code Playgroud)
然后我就可以得到一个模型如下
var mongoose = require('mongoose');
var TestModel = mongoose.model("Test");
var Test = new TestModel();
Run Code Online (Sandbox Code Playgroud)
为什么不尝试从应用程序核心模块导出 mongoose 实例并稍后在网络应用程序中使用它来连接到数据库
应用程序核心index.js
var mongoose = require('mongoose');
module.exports = {
mongooseInstance: mongoose };
Run Code Online (Sandbox Code Playgroud)
网络应用程序index.js
var core = require('app-core'),
mongoose = core.mongooseInstance,
mongooseClient = mongoose.connect(DB_URL);
// and so on
Run Code Online (Sandbox Code Playgroud)
只要您需要控制器中的模型在 index.js 中的代码之后初始化,这可能就有效。我希望我的回答有帮助。
归档时间: |
|
查看次数: |
1426 次 |
最近记录: |