2013-06-13 3 views
17

私はNode.jsとMongoDBの両方が初めてですが、SOとmongoのドキュメントからいくつかの部分をまとめました。私は一箇所のみ1つの関数にDBを使用する必要がある場合は正常に見えるNode.jsとMongoDB、DBオブジェクトを再利用する

// Retrieve 
var MongoClient = require('mongodb').MongoClient; 

// Connect to the db 
MongoClient.connect("mongodb://localhost:27017/exampleDb", function(err, db) { 
    if(!err) { 
    console.log("We are connected"); 
    } 
}); 

モンゴのdocumentetionは、例を示します。 SOの検索と読み取りでは、毎回新しい接続を開くべきではなく、プールを使用してデータベースオブジェクトを再利用することが初めてわかりました。この回答は非常に豊富ですが、最初にDBオブジェクトを取得する方法と再利用する方法がわかりません。

どのように置くことを約行くだろう
app.post('/employee', function(req, res){ 
    //Put req.name in database 
}); 


app.post('/car', function(req, res){ 
    //Put req.car in database 
}); 

は、私は私のApp.jsで上のNode.jsのコードを持っている、と私は、その後のようなデシベルに異なる操作を実行する必要がdifferntのルートを持っていると言いますこれらの2つのスニペットを一緒に何かに役立つ?

私は同様の質問をNode.js reuse MongoDB referenceに見つけましたが、この外観(http://mongodb.github.io/node-mongodb-native/driver-articles/mongoclient.html)では、db()ではなくMongoClientを使用する必要があります。そして私はそれが私の問題を解決するかどうか確信していません...

答えて

36

いつもあなたのデータベース接続を初期化するモジュールを書くことができます。たとえば、次のように

mongo.js

var mongodb = require('mongodb'); 

module.exports.init = function (callback) { 
    var server = new mongodb.Server("127.0.0.1", 27017, {}); 
    new mongodb.Db('test', server, {w: 1}).open(function (error, client) { 
    //export the client and maybe some collections as a shortcut 
    module.exports.client = client; 
    module.exports.myCollection = new mongodb.Collection(client, 'myCollection'); 
    callback(error); 
    }); 
}; 

app.js

var mongo = require('./mongo.js'); 

//setup express... 

//initialize the db connection 
mongo.init(function (error) { 
    if (error) 
     throw error; 

    app.listen(80); //database is initialized, ready to listen for connections 
}); 

randomFile.js

var mongo = require('./mongo.js'); 

module.exports.doInsert = function() { 
    //use the collection object exported by mongo.js 
    mongo.myCollection.insert({test: 'obj'}, {safe:true}, function(err, objects) { 
    if (err) 
     console.warn(err.message); 
    }); 
}; 

私は、人々がプールの話を知っているが、私はのベンチマークをしたときすべての要求に対して単一の接続に対してmongo接続をプーリングすると、実際には1つの接続が良好に実行されました。確かに、これは約1年前ですが、私は基本的な考え方が変わったのか疑問です。すべてのリクエストは非同期であるため、同時リクエストを行うために複数の接続が必要なわけではありません。

MongoClientまで、私は彼らが奨励している新しい構文だと思います。いずれにしても、使用するスタイルにかかわらず、保持してアクセス可能にするのは基本的にクライアントオブジェクトです。

+0

うーん、試してみる前にモジュールやものを読み上げる必要があります。 "module.exports.init"は私には見えます:)しかし、あなたが言っているのは、 "app.js"のコードは一度しか実行しないでください。そして、 "randomFile.js"のコードは私が使っているコードです私のapp.post( '/ employee')にありますか?私の初めてのことで、1つのApp.jsファイルにすべてがあります。 – user2288749

+0

そうです、 'init'関数は一度だけ呼び出されるべきです。 'randomFile.js'は、コード内のどこからでも初期化されたデータベースを使用できることを示す例です。私はapp.jsのように簡単に使うことができますあなたは、ノードを使って作業する場合、モジュールの仕組みを理解しておくべきですが、実際には難しくありません。 –

+0

あなたの時間と労力に感謝して、私は今日働いている!私がサーバーを起動すると、すぐにDBへの5つの接続が得られます。それは悪いですか? (デフォルトの許可された接続なので、推測5) 私はinit呼び出しを変更しました。どのようにモジュールを使用していますか?http://pastebin.com/QFdZY51F – user2288749

3

あなたの最後のコードスニペットから、Expressまたは同様のフレームワークを使用しているようです。 express-mongo-dbを使用してreqオブジェクト内の接続を取得できます。このミドルウェアはあなたのための接続をキャッシュし、他の着信要求と共有します:

app.use(require('express-mongo-db')(require('mongodb'), { db: 'test' })) 
app.post('/employee', function(req, res){ 
    // req.db.collection('names'),insert(req.name) 
    // Put req.name in database 
}); 


app.post('/car', function(req, res){ 
    // req.db.collection('names').insert(req.name) 
    // Put req.car in database 
}); 
関連する問題