Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在节点web应用程序中,是否为每个HTTP请求打开一个MongoDB连接?_Javascript_Node.js_Mongodb_Express - Fatal编程技术网

Javascript 在节点web应用程序中,是否为每个HTTP请求打开一个MongoDB连接?

Javascript 在节点web应用程序中,是否为每个HTTP请求打开一个MongoDB连接?,javascript,node.js,mongodb,express,Javascript,Node.js,Mongodb,Express,我正在将MongoDB添加到我的Express.js节点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) {

我正在将MongoDB添加到我的Express.js节点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);   
                });             
            });
        });
    });
});
假设我想坚持默认设置(目前):

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

  • 如果模式是正确的,那么我该如何处理这里发生的明显的代码重复?显然,就目前而言,该准则是不可接受的


  • 不要关闭并重新打开连接,您只是失去了资源:使用新标准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并在任何地方重复使用。或者创建5,检查连接池是的,但只从one@j_mcnally等等,为什么是5?当然是并发。您的连接迟早会被阻止查找一个人的数据,因此最好打开几个连接。因此,mongodb API基本上不支持承诺?这个assign全局变量在异步回调中看起来不太好。什么意思,它不是全局的——但是是的,您需要等待数据库连接后才能使用它…外部作用域变量是从内部作用域回调中分配给的。如果这是标准方法,很好,但我不喜欢这种模式。承诺会更好,即var db=MongoClient.connect(…)。不同意承诺会更好。关于导出,我如何导出仅在异步回调中可用的
    db
    值?这将帮助您。
    var db = require('./db.js')
    
    //once connected
    
    //db.users.find()... etc