Node.js和MongoDB如何重用DB对象?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (156)

我对Node.js和MongoDB都很陌生,但我已经设法从SO和mongo的文档中组合一些部分。

Mongo文档给出了这个例子:

// Retrieve
var MongoClient = require('mongodb').MongoClient;

// Connect to the db
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) {
  if(!err) {
    console.log("We are connected");
  }
});

这看起来很好,如果我只需要在一个地方使用一个函数中的数据库。在SO上搜索和阅读已经告诉我,我不应该每次都打开一个新的连接,而是使用一个pool并重用我第一次获得的数据库对象。这个答案很丰富,但我不确定如何获得DB对象,然后如何重用它。

假设我的App.js中有上面的Node.js代码,然后我有不同的路由需要对db执行不同的操作:

app.post('/employee', function(req, res){
    //Put req.name in database
});


app.post('/car', function(req, res){
    //Put req.car in database
});

我会如何将这两个片段合并成一些有用的东西?

我在Node.js中发现了一个类似的问题,重复使用了MongoDB引用,但是从这个的外观来看,它看起来像我应该使用MongoClient而不是db()。

提问于
用户回答回答于

你总是可以编写一个模块来初始化你的数据库连接,并使它们在整个程序中都可以访问。例如:

mongo.js

var mongodb = require('mongodb');

module.exports.init = function (callback) {
  var server = new mongodb.Server("127.0.0.1", 27017, {});
  new mongodb.Db('test', server, {w: 1}).open(function (error, client) {
    //export the client and maybe some collections as a shortcut
    module.exports.client = client;
    module.exports.myCollection = new mongodb.Collection(client, 'myCollection');
    callback(error);
  });
};

app.js

var mongo = require('./mongo.js');

//setup express...

//initialize the db connection
mongo.init(function (error) {
    if (error)
        throw error;

    app.listen(80); //database is initialized, ready to listen for connections
});

randomFile.js

var mongo = require('./mongo.js');

module.exports.doInsert = function () {
  //use the collection object exported by mongo.js
  mongo.myCollection.insert({test: 'obj'}, {safe:true}, function(err, objects) {
    if (err)
        console.warn(err.message);
  });
};

我知道人们谈论池化,但是当我将池化mongo连接与所有请求的单个连接进行基准对比时,单个连接实际上表现更好。当然,这是大约一年前,但我怀疑基本概念已经改变。所有请求都是异步的,所以不需要多个连接来完成同时请求。

至于MongoClient,我想这是他们鼓励的新语法。无论哪种方式,它本质上都是一个客户端对象,无论使用哪种风格,都希望保持并访问它。

用户回答回答于

从你最后的代码片段,看起来像你使用Express或类似的框架。你可以使用express-mongo-db来获得req对象内部的连接。该中间件会为缓存连接并与其他传入请求共享:

app.use(require('express-mongo-db')(require('mongodb'), { db: 'test' }))
app.post('/employee', function(req, res){
    // req.db.collection('names'),insert(req.name)
    // Put req.name in database
});


app.post('/car', function(req, res){
    // req.db.collection('names').insert(req.name)
    // Put req.car in database
});

扫码关注云+社区

领取腾讯云代金券