2016-11-30 4 views
1

私は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接続の数が上がっていくのを見ているだけです。これはいいことではないと私は思います。接続の数と長さのバランスをとらえなければならないのでしょうか?

答えて

2

一度接続してすべてのハンドラで使用する必要があります。

今は、データベースをまったく使用しないリクエストであっても、1回のリクエストごとにデータベースに再接続しています。また、接続を確立するのを待つ前にnext()を呼び出しています。

データベース接続は一度限りのものではなく永続的なものであるため、あなたのアプローチではパフォーマンスが非常に悪くなる可能性が高く、なぜそうしたいのかわからないのです。一度の接続で何か問題がありましたか?私はそれがあなたのデータベースを叩くことが助けになるとは思わない。何かがあれば、事態を悪化させるだけです。あなたのようなあなたが使用できるいくつかのオプションがあるネイティブ MongoDB Node.js Driverとモンゴに接続

  • poolSizeは - 個々のサーバーまたはプロキシ接続の最大プールサイズを設定します(デフォルトは5です)
  • autoReconnect - エラー時に再接続します(デフォルトtrueされる)いくつかの他の興味深いオプションが

です:reconnectTries,reconnectInterval,keepAlive,connectTimeoutMS,socketTimeoutMS

デフォルトに不満がある場合は、これらのオプションの値を変更することができます。詳細情報については

は、以下を参照してください。

+0

Webサイトサーバーの起動時に一度データベースを作成し、必要に応じてすべてのクエリにその接続を使用しますか?それはデータベースとの接続に過ぎませんか?または、サイトにアクセスする各ユーザーが新しい接続を開始しますか? 私は接続要求でデータベースを叩きたくないということに同意しますが、プログラムの存続期間中は接続を開いたままにしておくことをお勧めしませんでしたので、何らかのバランスを見つけることを試みていました。これはmongoのようなデータベースを使用した初めてのことですので、ベストプラクティスが何であるかは分かりません。 –

+0

[this](https://www.terlici.com/2015/04/03/mongodb-node-express.html)のようなアプローチはもっと適切でしょうか? –

+0

@GeoffMcLennanはい、一度接続を開いて使用するだけで問題ありません。デフォルトに慣れていない場合は、再接続、プーリングなどを設定するオプションを変更できます。私が答えに加えたリンクを見てください。 – rsp

関連する問題