如何连接到数据库?
为了使用 MongoDB 本机驱动程序进行连接,您需要执行以下操作:
var util = require('util');
var mongodb = require('mongodb');
var client = mongodb.MongoClient;
var auth = {
user: 'username',
pass: 'password',
host: 'hostname',
port: 1337,
name: 'databaseName'
};
var uri = util.format('mongodb://%s:%s@%s:%d/%s',
auth.user, auth.pass, auth.host, auth.port, auth.name);
/** Connect to the Mongo database at the URI using the client */
client.connect(uri, { auto_reconnect: true }, function (err, database) {
if (err) throw err;
else if (!database) console.log('Unknown error connecting to database');
else {
console.log('Connected to MongoDB database server at:');
console.log('\n\t%s\n', uri);
// Create or access collections, etc here using the database object
}
});
基本连接是这样设置的。这就是我能给你的只是你想要的基本描述。发布一些您到目前为止获得的代码以获得更具体的帮助。
我应该在每个文件中创建一个连接并使用它们吗?
不。
那么如何创建单个连接池并在所有 collections.js 文件中使用它呢?
您可以使用上述代码创建单个文件,我们称之为dbmanager.js
连接到数据库。导出在您的数据库上运行的函数,如createUser
,deleteUser
等,然后导出函数,如下所示:
module.exports = {
createUser: function () { ; },
deleteUser: function () { ; }
};
然后你可以require
从另一个文件中像这样:
var dbman = require('./dbmanager');
dbman.createUser(userData); // using connection established in `dbmanager.js`
编辑:因为我们正在处理 JavaScript 和单线程,所以本机驱动程序确实会自动为您处理连接池。您可以在下面的 StackOverflow 链接中查找此内容以获得更多确认。OP也确实在问题中说明了这一点。这意味着您的服务器实例client.connect
应该只调用一次。database
从对 的调用中成功检索到对象后client.connect
,该database
对象应在整个应用程序实例中重用。这可以通过使用 Node.JS 提供的模块模式轻松完成。
我的建议是创建一个模块或一组模块,作为与数据库交互的单点联系。在我的应用程序中,我通常有一个依赖于本机驱动程序的模块,调用require('mongodb')
. 我的应用程序中的所有其他模块都不会直接访问数据库,而是所有操作都必须由该数据库模块协调。
这将处理本机驱动程序的所有代码封装到单个模块或一组模块中。OP 似乎认为我发布的简单代码示例存在问题,在我的示例中描述了“单个大闭包”的问题。这都是非常基本的东西,所以我在这里添加了关于工作中的基本架构的说明,但我仍然觉得没有必要更改任何代码。
OP 似乎也认为可以在这里建立多个连接。使用此设置是不可能的。如果您像我上面建议的那样创建了一个模块,那么第一次require('./dbmanager')
调用它将执行文件中的代码dbmanager.js
并返回module.exports
对象。导出对象被缓存,并且在每次后续调用时也会返回require('./dbmanager')
,但是,其中的代码dbmanager.js
只会在第一个执行require
。
如果您不想创建这样的模块,那么另一个选项是仅导出database
传递给回调的参数,client.connect
并在整个应用程序的不同位置直接使用它。但是,无论 OP 有什么顾虑,我都建议不要这样做。
类似的,可能重复的 Stackoverflow 问题,其中包括: