【问题标题】:In a Node web app, do you open one MongoDB connection for each HTTP request?在 Node Web 应用程序中,您是否为每个 HTTP 请求打开一个 MongoDB 连接?
【发布时间】:2014-01-23 04:51:00
【问题描述】:

我正在将 MongoDB 添加到我的 Express.js Node Web 应用程序中。这是我到目前为止得到的:

// in app.js
var mongodb = require('mongodb');
var mongourl = /* … */;

// These are just examples:

app.get('/write', function (req, res) {
    mongodb.connect(mongourl, function (err, db) {
        db.collection('Users', function (err, coll) {
            coll.insert(/* stuff */, function (err) {
                res.send(200, 'Done.');
            });
        });
    });
});

app.get('/read', function (req, res) {
    mongodb.connect(mongourl, function (err, db) {
        db.collection('Users', function (err, coll) {
            coll.find({}, function (err, cursor) {
                cursor.toArray(function (err, items) {
                    res.send(200, items);   
                });             
            });
        });
    });
});

假设我想坚持使用默认的mongodb driver(现在):

  1. 这种模式对吗?我是否必须在执行数据库操作的每个不同路由中打开到数据库的新连接?

  2. 如果模式是正确的,那么我该如何处理这里发生的明显的代码重复?显然,就目前的情况,代码是不可接受的。

【问题讨论】:

标签: javascript node.js mongodb express


【解决方案1】:

使用新标准 MongoClient。它为您管理池,默认为 5。

  //require as a module to be used anywhere.

  module.exports = {}  

  var MongoClient = require('mongodb').MongoClient;
  var mongoURI = /* … */;

  MongoClient.connect(mongoURI, function(err, db) {
    if(err) throw err;

    module.exports.users = db.collection('users');

    console.log('Connected to Mongo!')

  })

然后

var db = require('./db.js')

//once connected

//db.users.find()... etc

签出: http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html

池化细节: http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html#connection-pool-configuration

【讨论】:

  • 那么,mongodb API基本上不支持promise?从异步回调中分配全局变量看起来不太好。
  • 什么意思,它不是全局的——但是是的,您需要等待数据库连接才能使用它...
  • 外部范围变量从内部范围回调中分配。如果这是标准方法,很好,但我不喜欢这种模式。承诺会更好,即var db = MongoClient.connect(...);
  • 不同意承诺会更好。
  • 关于导出,我将如何导出仅在异步回调中可用的db 值?
【解决方案2】:

不要关闭并重新打开连接,你只是在失去资源:s

【讨论】:

  • 创建连接并将其存储到 var 中,如 db 并在任何地方重复使用。
  • 或者创建5,查看连接池github.com/coopernurse/node-pool
  • 是的,但只从一个开始
  • @j_mcnally 等等,为什么是 5?
  • 当然是并发。您的连接将被阻止查找一个人的数据仍然存在时间问题,因此最好打开几个连接。
猜你喜欢
  • 2012-02-11
  • 1970-01-01
  • 2012-08-07
  • 2021-05-10
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2014-11-22
相关资源
最近更新 更多