我剛剛學習如何使用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連接上去了,我認爲這不是一件好事。僅僅是你必須在連接的數量和長度之間找到平衡點?
所以,如果我應該連接到數據庫一旦啓動網站服務器,然後根據需要使用該連接進行所有查詢?這只是一個連接到數據庫?或者每個訪問該網站的用戶都會啓動一個新的連接? 我確實同意我不想用連接請求敲擊數據庫,但我不認爲在程序的整個生命週期中保持連接處於打開狀態並不是一個好主意,所以我試圖找到某種平衡。這是我第一次使用mongo這樣的數據庫,所以我不確定最佳實踐是什麼。 –
像[this](https://www.terlici.com/2015/04/03/mongodb-node-express.html)這樣的方法會更合適嗎? –
@GeoffMcLennan是的,打開連接一次就可以使用它。如果您對默認值不滿意,您可以更改配置重新連接,池化等選項。查看我添加到答案中的鏈接。 – rsp