跨多个模型导出和重用我的猫鼬连接

Posted

技术标签:

【中文标题】跨多个模型导出和重用我的猫鼬连接【英文标题】:Export and reuse my mongoose connection across multiple models 【发布时间】:2014-06-11 04:08:58 【问题描述】:

我有一个目录结构

./lib
./lib/model1.js
./lib/model2.js

两个模型都使用 mongoose 连接到同一个 MongoDB 实例,但定义了不同的模型:

// model1.js
var mongoose = require ('mongoose');
mongoose.connect ('bla')
var db = mongoose.connection;

var schema1, model1;

db.on('error', console.error.bind(console, 'database, why you no connect?'));

db.once('open', function callback () 

  schema1 = mongoose.Schema(
    // some properties
  );

  model1 = mongoose.model1 ('model1', schema1);

);

创建一次数据库连接并为每个模型重复使用它的最佳方法是什么?最好的目录结构是什么?也许./lib/middleware/db.js

This question好像有关系,但是它使用的是mongodb npm模块而不是mongoose,问题不清楚,作者的所有cmet都被删除了。

【问题讨论】:

【参考方案1】:

您应该只在应用程序的启动代码中调用一次mongoose.connect。这将为您的应用程序创建默认连接池。

您的model1.jsmodel2.js 文件通过调用mongoose.model 创建它们的模型,这将它们绑定到默认连接。

所以它实际上是由 Mongoose 为你处理的。

【讨论】:

所以@JohnnyHK,我只是想验证一些东西。你是说人们真的不需要导出 mongoose 对象,无论它在哪里连接到他们的数据库,因为他们在整个代码中总是有相同的对象,只需使用 require('mongoose') 语句?【参考方案2】:

在 ./app.js 中:

var mongoose = require('mongoose');
mongoose.connect('connStr'); //connect once

在 ./lib/model1.js 中:

var mongoose = require('mongoose');
var model1 = mongoose.model('model1', 
  foo1:  type: String, required: false,
  bar1:  type: String, required: false
);
module.exports = model1;

在 ./lib/model2.js 中:

var mongoose = require('mongoose');
var model2 = mongoose.model('model2', 
  foo2:  type: String, required: false,
  bar2:  type: String, required: false
);
module.exports = model2;

然后像这样使用这些模型(例如在 ./routes.js 中):

var model1 = require('./lib/model1.js');
var m1 = new model1(
   foo: 'value_for_foo',
   bar: 'value_for_bar'
);

m1.save(function (err) 
    if (err) console.log(err.stack);    
    console.log('saving done...');
);

【讨论】:

如果我有多个连接怎么办?猫鼬不再工作了 @badrslaoui 请参考这个 SO answear:***.com/a/19475259/2013487 评论旧线程,但这似乎不再起作用。知道现在该怎么做吗?

以上是关于跨多个模型导出和重用我的猫鼬连接的主要内容,如果未能解决你的问题,请参考以下文章

如果文件未导出,如何使用在单独文件中定义的猫鼬模型?

要导出以编辑表单的猫鼬日期值

如何基于作为参数传递的动态模式的猫鼬模型?

具有多个和可选字段的猫鼬查找

跨多个服务和 .net 版本重用类型

如何在我的猫鼬模式中引用多个模式?