これは私には少し不明確です(私は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サーバーに負担をかけすぎていませんか?特に、このような呼び出しが数百(数千ではないにしても)発生する場合(そして私がそれに到達することを願っています)?
前もって感謝します。
私は 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));
});
});
私がこれを処理するのが好きな方法は、延期/約束を使用することです。 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
});
});
マングースは漠然とこれに似た方法で接続を処理すると思います。