web-dev-qa-db-ja.com

Node.jsでのMongoDB接続のベストプラクティスは何ですか?

これは私には少し不明確です(私はNodeとMongoを始めたばかりです)、そしてサーバーのパフォーマンスと負担のために本当に心配です(これは別の質問だと思います) 、しかし、私は投稿の終わりにそれについて説明します)。

したがって、Node.jsとRestifyを使用してAPIを作成していると仮定すると、各APIエンドポイントは関数に対応します。

a) db接続を開き、グローバル変数に格納してから、すべての関数でそれを使用しますか?
例:

// requires and so on leave me with a db var, assume {auto_reconnect: true}
function openDB() {
    db.open(function(err, db) {
        // skip err handling and so on
        return db;
    }
}

var myOpenDB = openDB(); // use myOpenDB in every other function I have

b) db接続を開き、すべてを1つの巨大なクロージャーに入れますか?
例:

// same as above
db.open(function(err, db) {
    // do everything else here, for example:
    server.get('/api/dosomething', function doSomething(req, res, next) { // (server is an instance of a Restify server)
        // use the db object here and so on
    });
}

c)必要になるたびにデータベースを開いたり閉じたりしますか?
例:

// again, same as above
server.get('/api/something', function doSomething(req, res, next) {
    db.open(function(err, db) {
        // do something
        db.close();
    });
});

server.post('/api/somethingelse', function doSomethingElse(req, res, next) {
    db.open(function(err, db) {
        // do something else
        db.close();
    });
});

この最後のものは私が直感から行うことですが、同時に私はこれを行うことに完全に快適ではありません。 Mongoサーバーに負担をかけすぎていませんか?特に、このような呼び出しが数百(数千ではないにしても)発生する場合(そして私がそれに到達することを願っています)?

前もって感謝します。

35
arturovm

私は MongoJS がとても好きです。これにより、デフォルトのコマンドラインと非常によく似た方法でMongoを使用でき、公式のMongoドライバーのラッパーにすぎません。 DBを1回だけ開き、使用するコレクションを指定します。 Node with --harmony-proxiesを実行すると、コレクションを省略できます。

var db = require('mongojs').connect('mydb', ['posts']);

server.get('/posts', function (req, res) {
  db.posts.find(function (err, posts) {
    res.send(JSON.stringify(posts));
  });
});
13
juandopazo
  • オプションAは、HTTPリクエストが処理される前にDBのオープンが完了する保証がないため、優れたアイデアではありません(これはほとんどあり得ないことです)。
  • オプションCも、DB接続を不必要に開いたり閉じたりするため、理想的ではありません。

私がこれを処理するのが好きな方法は、延期/約束を使用することです。 Nodeで利用できるさまざまなpromiseライブラリがたくさんありますが、基本的な考え方は次のようなことです。

var promise = new Promise();

db.open(function(err, db) {
    // handle err
    promise.resolve(db);
});

server.get('/api/something', function doSomething(req, res, next) {
    promise.then(function(db)
        // do something
    });
});

マングースは漠然とこれに似た方法で接続を処理すると思います。

6
scttnlsn