在express.js中连接Mongodb-Native-Driver

Sar*_*tra 13 mongodb node.js express node-mongodb-native

我在express.js应用程序中使用mongodb-native-driver.我在数据库中有大约6个集合,所以我创建了6个js文件,每个文件都有一个集合作为javascript对象(例如function collection(){}),原型函数处理这些集合上的所有操作.我认为这将是一个很好的架构.

但我遇到的问题是如何连接到数据库?我应该在每个文件中创建一个连接并使用它们吗?我认为这将是一种矫枉过正,因为mongodb-native-driver中的连接创建了一个连接池,并且其中有几个连接不合理.

那么如何创建单个连接池并在所有collections.js文件中使用它?我希望得到像在mongoose中实现的连接.如果我在应用程序架构中的任何思维过程都是错误的,请告诉我.

使用Mongoose可以解决这些问题,但我在几个地方读过它比本机驱动程序慢,而且我更喜欢无模式模型.

编辑:我用模型创建了一个模块.每个集合都在一个文件中,它将数据库作为参数.现在在index.js文件中,我调用数据库连接并在从连接获取数据库后保留变量db.(我使用了自动重新连接功能来确保连接没有丢失).在同一个index.js文件中,我像这样导出了每个集合

exports.model1 = require('./model1').(db)
exprorts.model2 = require('./model2').(db)
Run Code Online (Sandbox Code Playgroud)

这确保了数据库的一部分,在短短一个模块处理和应用程序只需调用每个model.js文件中导出函数一样save(),fincdbyid()等(whatever you do in the function is upto you to implement).

Cor*_*oss 18

如何连接数据库?

要使用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
    }
});
Run Code Online (Sandbox Code Playgroud)

基本连接是这样设置的.这就是我可以给你的所有内容,只是你想要的基本描述.发布到目前为止您已获得的一些代码以获得更具体的帮助.

我应该在每个文件中创建一个连接并使用它们吗?

没有.

那么如何创建单个连接池并在所有collections.js文件中使用它?

您可以使用上面的代码创建单个文件,让我们调用它dbmanager.js连接到数据库.导出功能类似createUser,deleteUser等等,你的数据库进行操作,然后导出功能,如下所示:

module.exports = {
    createUser: function () { ; },
    deleteUser: function () { ; }
};
Run Code Online (Sandbox Code Playgroud)

你可以require从另一个文件,如下所示:

var dbman = require('./dbmanager');

dbman.createUser(userData); // using connection established in `dbmanager.js`
Run Code Online (Sandbox Code Playgroud)

编辑:因为我们正在处理JavaScript和单个线程,本机驱动程序确实会自动为您处理连接池.您可以在下面的StackOverflow链接中查找此信息,以便对此进行更多确认.OP也在问题中说明了这一点.这意味着client.connect应该只能由服务器实例调用一次.后database对象成功地从一个呼叫检索client.connect,该database对象应该在你的应用程序的整个实例被重用.这可以通过使用Node.JS提供的模块模式轻松完成.

我的建议是创建一个模块或一组模块,作为与数据库交互的单一联系点.在我的应用程序中,我通常有一个模块,它取决于本机驱动程序,调用require('mongodb').我的应用程序中的所有其他模块都不会直接访问数据库,而是所有操作都必须由此数据库模块协调.

这将处理本机驱动程序的所有代码封装到单个模块或模块集中.OP似乎认为我发布的简单代码示例存在问题,在我的示例中描述了"单个大封闭"的问题.这些都是非常基本的东西,所以我在这里添加关于基本架构的澄清,但我仍然觉得不需要更改任何代码.

OP似乎也认为可以在这里建立多个连接.这种设置无法做到这一点.如果你按照我的建议创建了一个模块,那么第一次require('./dbmanager')调用它将执行文件中的代码dbmanager.js 返回该module.exports对象.exports对象被缓存,并且在每次后续调用时也会返回require('./dbmanager'),但是,代码dbmanager.js只会在第一次执行时执行require.

如果您不想创建这样的模块,那么另一个选项是仅导出database传递给回调,client.connect并直接在整个应用程序的不同位置使用它.无论OP如何关注,我建议不要这样做.

类似的,可能重复的Stackoverflow问题,其中包括: