hen*_*hen 4 database mongoose mongodb node.js
我已经阅读了几个关于 mongoose.connect() 和 mongoose.createConnection() 的 stackoverflow 文档和 mongoose 文档,但似乎没有对后者的明确解释,特别是在哪里建立连接。我不确定在哪里进行 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.");
});
Run Code Online (Sandbox Code Playgroud)
但正如我之前所说,如果我更改了上面的代码并使用
var connection = mongoose.createConnection()
Run Code Online (Sandbox Code Playgroud)
我无法导出connection保存从 mongoose.createConnection() 返回的连接对象的变量。那么我是否必须在模型中自行制作它,例如
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;
Run Code Online (Sandbox Code Playgroud)
我也明白另一种选择是有一个单独的文件来建立所有数据库连接而不是在服务器文件中,但如果我这样做,我该怎么做才能只在必要时建立连接?
更新:我在模型中添加了 createConnection() 并且它似乎运行良好。但是,我知道在模型内部创建连接并不理想,但如果是这样,我可以在哪里设置 createConnection(),因为当它在另一个文件中定义时,我无法导出它并将其导入模型中例如在 server.js 中。任何建议,将不胜感激。
你可以像这样制作一个 mongoose.js 文件:
const mongoose = require('mongoose');
mongoose.Promise = global.Promise;
mongoose.connect(process.env.MONGODB_URI, {useMongoClient: true});
module.exports = {mongoose};
Run Code Online (Sandbox Code Playgroud)
然后你需要在你的猫鼬模型文件中,如下所示:
const mongoose = require('mongoose');
Run Code Online (Sandbox Code Playgroud)
这样,您只需编写一次连接代码,就可以将其导入到您认为合适的任何地方。