2014-01-05 17 views
0

我將MongoDB添加到我的Express.js節點網絡應用程序中。這是我走到這一步:在Node web應用程序中,您是否爲每個HTTP請求打開一個MongoDB連接?

// 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. 如果模式是正確的,那麼我該如何處理在這裏進行的明顯的代碼重複?顯然,就目前而言,代碼是不可接受的。

+0

這將幫助你。 https://stackoverflow.com/questions/38485575/best-way-to-connect-to-mongodb-using-node –

回答

0

不要關閉並重新打開連接,你只是失去資源:■

+0

反而做什麼? –

+0

創建您的連接並將其存儲到var中,如db,並在任何地方重複使用它。 – farvilain

+0

或創建5,檢查連接池https://github.com/coopernurse/node-pool –

2

使用的新標準,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

+0

所以,基本上mongodb API不會支持承諾?從異步回調中分配全局變量看起來不太好。 –

+0

你是什麼意思,它不是全局的 - 但是你需要等待數據庫連接,然後才能使用它... – boom

+0

外部範圍變量是從內部範圍回調中分配的。如果這是標準方法,那麼好,但我不喜歡這種模式。承諾會更好,即'var db = MongoClient.connect(...);'。 –

相關問題