2016-11-30 98 views
1

我剛剛學習如何使用node/express和mongodb,並且我對關於連接池的工作有些困惑。在Express路由器中使用mongoDB

我現在的策略是在路由器級別連接數據庫,因此每條路由都有自己的連接。我對我的路線之一的代碼如下所示:

var express = require('express'); 
var router = express.Router(); 

var config = require('../config.json'); 

var url = config.db.URI; 

var MongoClient = require('mongodb').MongoClient 
    , assert = require('assert'); 

var db; 

// Connect to database 
router.all('*', function(req, res, next) { 
    console.log('Connecting to db'); 
    MongoClient.connect(url, function(err, database) { 
     assert.equal(null, err); 
     db = database; 
    }); 
    next(); 
}); 

// GET admin list page 
router.get('/', function(req, res, next) { 
    res.render('lists/index'); 
    var coll = db.collection('lists'); 
    coll.find().each(function(err, obj) { 
     console.log(obj); 
    }); 
    next(); 
}); 

router.get('/new', function(req, res, next) { 
    res.render('lists/new'); 
    next(); 
}); 

router.all('*', function(req, res, next) { 
    console.log('Closing database'); 
    //db.close(); 
}); 

module.exports = router; 

我測試這個觀點如何與我有兩個router.all功能包我的http請求的數據庫交互。在我看來,任何時候請求這個路由器中的一個頁面,服務器應該連接到數據庫,允許相應的http請求功能訪問數據庫(在這種情況下,只是將其內容打印到控制檯),然後關閉它一旦http請求完成。然而,這種情況並非如此。正如你所看到的,我已經註釋掉了db.close函數,因爲它會拋出一個錯誤,提示「發送後無法設置標題」。我認爲這意味着我不太理解Express路由「管道」,並且事情並沒有按照我期望的順序執行。

我應該使用不同的路由器方法嗎?也許router.use?或者我以錯誤的方式處理這個問題,是否應該將我的數據庫連接放在其他地方?

我在使用this作爲一個參考,對於什麼是良好的實踐,只要彙集,但他們似乎並沒有關閉連接?如果我沒有關閉連接,我只會看到我的一些MongoDB連接上去了,我認爲這不是一件好事。僅僅是你必須在連接的數量和長度之間找到平衡點?

回答

2

您應該建立連接一次並在所有處理程序中使用它。

現在你正在做的是在每個請求上重新連接到數據庫,即使是那些根本不使用數據庫的請求。此外,你甚至在等待連接建立之前調用next()。

數據庫連接的意圖是持久的 - 不是一次性的事情,所以你的方法可能會導致性能很差,我甚至不知道你爲什麼要這麼做。您是否有任何連接問題?我不認爲像這樣錘擊你的數據庫會有幫助。如果有的話,它只會讓事情變得更糟。

當您連接到蒙戈與本地 MongoDB Node.js Driver有一些,你可以使用,類似的選項:

  • poolSize - 設置最大池爲每個單獨的服務器或代理的連接(缺省爲5
  • autoReconnect - 重新連接錯誤(默認爲true

一些其他有趣的選項是:reconnectTries,reconnectInterval,keepAlive,connectTimeoutMS,socketTimeoutMS

如果您對默認值不滿意,可以更改這些選項的值。

欲瞭解更多信息,請參閱:

+0

所以,如果我應該連接到數據庫一旦啓動網站服務器,然後根據需要使用該連接進行所有查詢?這只是一個連接到數據庫?或者每個訪問該網站的用戶都會啓動一個新的連接? 我確實同意我不想用連接請求敲擊數據庫,但我不認爲在程序的整個生命週期中保持連接處於打開狀態並不是一個好主意,所以我試圖找到某種平衡。這是我第一次使用mongo這樣的數據庫,所以我不確定最佳實踐是什麼。 –

+0

像[this](https://www.terlici.com/2015/04/03/mongodb-node-express.html)這樣的方法會更合適嗎? –

+0

@GeoffMcLennan是的,打開連接一次就可以使用它。如果您對默認值不滿意,您可以更改配置重新連接,池化等選項。查看我添加到答案中的鏈接。 – rsp