在哪里建立mongoose连接/任何数据库连接?

5
我已经阅读了几篇stackoverflow文档和mongoose文档,涉及mongoose.connect()和mongoose.createConnection(),但似乎没有明确说明后者的内容,特别是在哪里建立连接。我不确定在哪个位置最好建立mongoose或任何数据库连接,但通常我会在我的server.js文件中进行连接。
在模型本身中建立连接是否可以?当使用mongoose.createConnection()时,似乎在模型中建立连接是唯一的选择,因为如果我在server文件中使用createConnection建立连接,则无法导出返回的连接对象并在模型文件中导入它。
当我只使用mongoose.connect()时,通常会在我的server文件中设置。
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)中定义,我无法导出并在模型中导入它。任何建议都将不胜感激。

2个回答

9
你可以这样创建一个mongoose.js文件:
const mongoose = require('mongoose');

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

module.exports = {mongoose};

然后您需要在mongoose模型文件中像这样使用它:

const mongoose = require('mongoose');

那样做,您只需编写一次连接代码,就可以将其导入到任何需要的位置。

谢谢这个。这非常有用。 - henhen
@henhen,我很高兴。如果这个回答解决了你的问题,请标记一下,这样其他人就可以更好地找到它。 - OArnarsson
当然,虽然答案只部分回答了我的问题,但我仍然需要知道在哪里正确使用mongoose.createConnection()函数。 - henhen

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

我意识到这种情况,但mongoose createConnection()的问题在于我无法导出和导入返回在我的模型var connection = mongoose.createConnection('localhost...)中的连接对象。这就是为什么我在模型内部设置连接,而且似乎它正在工作。你有更好的解决方案吗? - henhen
1
当然,在异步回调中无法导出本地对象,但是您可以将所有逻辑放在回调中,这意味着连接不是在另一个文件中创建的,而是在入口文件中创建的。或者,您可以在另一个文件中启动池,但仅导出池对象或使其全局化,因此当您需要获取连接时,可以在任何地方调用pool.getConnection()。如果您使用Express,请在中间件中调用getConnection(),并在getConnection()的回调中调用next()。 - A-yon Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接