在哪里进行猫鼬连接/任何数据库连接

Posted

技术标签:

【中文标题】在哪里进行猫鼬连接/任何数据库连接【英文标题】:Where to make mongoose connection / any database connection 【发布时间】:2018-03-14 08:10:37 【问题描述】:

我已经阅读了几个关于 mongoose.connect() 和 mongoose.createConnection() 的 *** 文档和 mongoose 文档,但是对于后者似乎没有明确的解释,特别是在哪里建立连接。我不确定建立猫鼬或任何数据库连接的最佳位置在哪里,但我通常在我的 server.js 文件中进行。

可以在模型本身中建立连接吗?使用 mongoose.createConnection() 时,似乎在模型中建立连接是唯一的选择,因为如果我在服务器文件中使用 createConnection 建立连接,我无法导出返回的连接对象并将其导入我的模型文件中.

当我只使用 mongoose.connect() 时,我通常在我的服务器文件中进行设置,

var databaseUri = "mongodb://localhost/sampledatabse1020";

if (process.env.MONGODB_URI) 
    mongoose.connect(process.env.MONGODB_URI);
 else 
    mongoose.connect(databaseUri)


var database = mongoose.connection;

database.on("error", function(err) 
  console.log("Mongoose Error: ", err);
);

database.once("open", function() 
  console.log("Mongoose connection successful.");
);

但正如我之前所说,如果我更改了上面的代码并使用了

var connection = mongoose.createConnection()

我无法导出包含从 mongoose.createConnection() 返回的连接对象的connection 变量。那么我是否必须在它自己的模型中制作它,例如

var mongoose = require("mongoose");

var connection = mongoose.createConnection('mongodb://localhost/food');

var Schema = mongoose.Schema;

var UserSchema = new Schema(
  first_name: 
    type: String,
    trim: true,
    required: "First Name is Required"
  ,
  last_name: 
    type: String,
    trim: true,
    required: "Last Name is Required"
  ,
  email: 
    type: String,
    trim: true,
    required: "Email is Required"
  
);

var User = connection.model('User', UserSchema);

module.exports = User;

我也明白另一种选择是有一个单独的文件来建立所有数据库连接,而不是在服务器文件中,但如果我这样做,我该怎么做才能只在必要时建立连接?

更新: 我在模型中添加了 createConnection() ,它似乎运行良好。但是,我知道在模型中创建连接并不理想,但如果是这样,我在哪里可以设置 createConnection(),因为当它在另一个文件中定义时,我无法将其导出并导入模型中例如在 server.js 中。任何建议将不胜感激。

【问题讨论】:

【参考方案1】:

你可以像这样制作一个 mongoose.js 文件:

const mongoose = require('mongoose');

mongoose.Promise = global.Promise;
mongoose.connect(process.env.MONGODB_URI, useMongoClient: true);

module.exports = mongoose;

然后你需要在你的猫鼬模型文件中像这样:

const mongoose = require('mongoose');

这样您只需编写一次连接代码,就可以将其导入到您认为合适的任何地方。

【讨论】:

谢谢。这非常有用。 @henhen 很高兴,如果这回答了您的问题,请标记它,以便其他人可以更好地找到它。 当然,虽然答案只是部分给了我答案,我仍然需要知道在哪里正确使用 mongoose.createConnection()【参考方案2】:

我不使用 Mongoose,但我认为每次创建新模型或实例时都会创建新的数据库连接是个坏主意。每个请求应该只有一个数据库连接,它们可以被回收到池中并等待下一个请求。这意味着无论您有多少模型,它们都应该共享与数据库的相同连接。我认为 MongoDB 的连接仍然很宝贵。希望这个建议对你有一点帮助。

【讨论】:

我知道这种情况,但是 mongoose createConnection() 的问题是我无法导出和导入在我的模型 var connection = mongoose.createConnection('localhost...) 中返回的连接对象。这就是为什么我在模型本身内建立连接并且它似乎正在工作。你会碰巧有更好的解决方案吗? 当然你不能在异步回调中导出本地对象,但是你可以把你所有的逻辑放在回调中,也就是说,连接不是在另一个文件中创建的,而是在入口文件中。或者您可以在另一个文件中启动池,但只导出池对象或使其成为全局对象,因此当您需要获取连接时,您可以在任何地方调用 pool.getConnection() 。如果使用 Express,在中间件中调用 getConnection(),在 getConnection() 的回调中调用 next()。

以上是关于在哪里进行猫鼬连接/任何数据库连接的主要内容,如果未能解决你的问题,请参考以下文章

连接停止时如何处理猫鼬数据库

猫鼬无法连接(本地主机)

如何在猫鼬中进行原始 mongodb 操作?

如何在猫鼬中进行原始 mongodb 操作?

猫鼬连接抛出 MongooseServerSelectionError

使用 mocha 进行所有测试后在哪里删除数据库并关闭连接