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

时间:2017-10-03 07:31:27

标签: node.js database mongodb mongoose

我已经阅读了几个关于mongoose.connect()和mongoose.createConnection()的stackoverflow文档和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;

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

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

2 个答案:

答案 0 :(得分:3)

你可以像这样制作一个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');

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

答案 1 :(得分:1)

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