私はnode/expressとmongodbの使い方を学んでいます。接続のプーリングについてはちょっと混乱しています。ExpressルータでmongoDBを使用する
私の戦略は、ルータレベルでデータベース接続を行うことです。各ルートには独自の接続があります。私のルートの1つのための私のコードは次のようになります。私はこのビューが私のHTTPリクエストを包む2つのrouter.all機能を持つ私のデータベースと対話する方法をテストしてい
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;
。私の考えでは、このルータのページがリクエストされると、サーバはデータベースに接続し、対応するHTTPリクエスト機能がデータベースにアクセスできるようにします(この場合、コンソールに内容を印刷するだけです)。 HTTP要求が完了するとしかし、そうではありません。ご覧のとおり、db.close関数は、「一度送信されるとヘッダーを設定できません」というエラーが表示されるため、db.close関数をコメントアウトしています。これは、私がExpressルート "pipeline"をよく理解していないことを意味しています。
私は使用しなければならない別のルータ方法がありますか?たぶんrouter.use?または私は間違った方法でこれに近づいていますか?データベース接続を別の場所に置くべきですか?
私はthisを参照として使用していますが、プーリングが行われる限りは何が良いのでしょうか。しかし、接続を閉じるようには思われません。私が接続を閉じなければ、私はmongodb接続の数が上がっていくのを見ているだけです。これはいいことではないと私は思います。接続の数と長さのバランスをとらえなければならないのでしょうか?
Webサイトサーバーの起動時に一度データベースを作成し、必要に応じてすべてのクエリにその接続を使用しますか?それはデータベースとの接続に過ぎませんか?または、サイトにアクセスする各ユーザーが新しい接続を開始しますか? 私は接続要求でデータベースを叩きたくないということに同意しますが、プログラムの存続期間中は接続を開いたままにしておくことをお勧めしませんでしたので、何らかのバランスを見つけることを試みていました。これはmongoのようなデータベースを使用した初めてのことですので、ベストプラクティスが何であるかは分かりません。 –
[this](https://www.terlici.com/2015/04/03/mongodb-node-express.html)のようなアプローチはもっと適切でしょうか? –
@GeoffMcLennanはい、一度接続を開いて使用するだけで問題ありません。デフォルトに慣れていない場合は、再接続、プーリングなどを設定するオプションを変更できます。私が答えに加えたリンクを見てください。 – rsp