【问题标题】:Best way to share database connection param with mongoose/node.js与 mongoose/node.js 共享数据库连接参数的最佳方式
【发布时间】:2012-03-30 05:12:36
【问题描述】:

我正在使用Mongoose 来管理 Mongo 数据库。我的连接文件很简单:

var mongoose = require('mongoose')

mongoose.connection.on("open", function(){
  console.log("Connection opened to mongodb at %s", config.db.uri)
});
console.log("Connecting to %s", config.db.uri)
mongoose.connect(config.db.uri)

global.mongoose = mongoose

然后在我的 app.js 中我只是

require('./database)

并且“mongoose”变量是全局可用的。我不想使用全局变量(至少不直接使用)。有没有更好的方法通过单例模式或其他方法跨节点共享数据库连接变量(我正在使用 express.js)?

【问题讨论】:

标签: node.js mongodb express mongoose


【解决方案1】:

我只是在我的 app.js 文件中执行以下操作:

var mongoose = require('mongoose');
mongoose.connect('mongodb://address_to_host:port/db_name');
modelSchema = require('./models/yourmodelname').YourModelName;
mongoose.model('YourModelName', modelSchema);
// TODO: write the mongoose.model(...) command for any other models you have.

此时任何需要访问该模型的文件都可以:

var mongoose = require('mongoose');
YourModelName = mongoose.model('YourModelName');

最后在你的模型中,你可以正常写入文件,然后在底部导出:

module.exports.YourModelName = YourModelName;

我不知道这是否是最好的最棒的解决方案(大约 2 天前我才开始考虑导出模块),但它确实有效。如果这是一个好方法,也许有人可以发表评论。

【讨论】:

  • 哦,好的,所以我不需要指向“mongoose”的全局变量,因为我可以在需要时使用它。
  • 是的,据我所知,express 也会缓存您加载的模块。因此,一旦 mongoose 被加载一次,express 就不会为每个需求从头开始重新加载它。如果有人可以肯定地证实这一点会很酷,但我很确定我在过去的某个地方读过。
  • 我不知道快速缓存,但我知道需要缓存它加载的模块。
  • 所需模块中的代码只执行一次。因此您可以根据需要多次请求模块,例如与 mongo db 的连接将只创建一次
  • @AntelopeSalad 原谅我,因为我是这里的新手,但yourmodelname.js 文件会是什么样子?另外,第一个代码示例的第 3 行缺少的右括号在哪里?
【解决方案2】:

如果你关注 commonjs 导出

exports.mongoose = mongoose

假设您的模块名称是 connection.js

你可以要求

   var mongoose = require('connection.js')

你可以使用猫鼬连接

【讨论】:

    【解决方案3】:

    我通常这样包装我的模型

    var MySchema = (function(){
    //Other schema stuff 
    
    //Public methods
    GetIdentifier = function() {
    return Id;
    };
    
    GetSchema = function() {
    return UserSchema;
    };
    
    return this;
    })();
    
    if (typeof module !== 'undefined' && module.exports) {
    exports.Schema  = MySchema;
    }
    

    在我的主课中,我这样做var schema = require('./schema.js').Schema; 并调用conn.model(schema.GetIdentifier(), schema.GetSchema()),当然在调用connect 或createConnection 之后。这允许我将模式插入标准方法集。这种概括很好,因为在掌握了连接和错误处理之后,您可以专注于您的模式。我还使用插件扩展模式,这允许我与其他模式共享插件。

    我想看看是否有人做得更好,但找不到好的模式,而且我对 Mongo 还很陌生。

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2023-03-12
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多