2016-04-09 8 views
4

私は同様の質問がされていることを知っていますが、実際にこれを行うコードを誰も実際に示しているわけではなく、コードを表示しないページにしかリンクしません。接続コールバックの外でMongoDBにアクセスする

とにかく、私のノードサーバーは基本的にsocket.ioイベントでデータを受信します。私はそのデータをMongoDBに入れたいと思っています。問題は、私がmongoで見たすべてのコード例は、dbオブジェクトを使用してMongoClient.connectコールバック内のdbのみを操作することです。

私はこのデータをたくさん取得しているので、何度も何度も初期化したくありません。

MongoClient.connect(("mongodb://" + process.env.IP + ":27017/feedback"), 
function(err, db) { ... }); 

そして後で:

socket.on('data', function (data) { 
    db.doStuff(); 
}); 
+1

グローバル変数を宣言し、 'connect'コールバックで成功した' db'を割り当てることができます。しかし、グローバル変数を使用することは良い方法ではありません。 –

+0

@SiddharthAjmera面白いことに、私はそれを試して、エラーは、割り当てられたグローバルがnullだと言った。 – Radeon348

+0

あなたは 'MongoClient.connect'のコールバックを提供しているので、グローバルが' null'だった可能性があります。 – AJB

答えて

4

MongoClient.connect()リターンあなたがそれにコールバックを与えていない場合は約束は、あなたがグローバルな約束を宣言することができ、私は必要なもの

が効果的にこれです:

var connect = MongoClient.connect(url); 

socket.on('data', function(data) { 
    connect.then(function(db) { 

    }); 
}); 

socket.on('otherData', function(data) { 
    connect.then(function(db) { 

    }); 
}); 
1

接続をvarにロードして、再接続する代わりにその接続を使用できるようにする必要があります。すべてのクエリの接続を確立します。

は、私が何かそうのように、独自のモジュールに接続コードを見つけ、同様のアプローチを自分自身を使用します。

注:このコードは、オフ・カフ、テストされていない、と私は思い少し飲んだ。

connect.js

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

module.exports = function(params) { 

    var ip = params.ip || process.env.IP; 
    var port = params.port || 27017; 
    var collection = params.collection; 

    var db = MongoClient.connect('mongodb://' + ip + ':' + port + '/' + collection); 

    return db; 

} 



そして、あなたのアプリケーション内の任意の他のモジュールでは、あなたはconnection.jsが必要となるので、同様に、任意の接続のためにparamsを渡す:

onFeedback.js

var feedbackDB = require('./connection.js')({ 
    collection : 'feedback' 
}); 

socket.on('data', function (data) { 
    feedbackDB(function(db){ 
    db.doStuff(); 
    }; 
}); 
+0

私はここであなたの方法を使いたいですが、悲しいことに、feedbackDBが関数ではないというエラーが出て、それを理解するために十分なmodule.exportsについてわかりません。私は今読んでいますが、あなたが私を助けることができれば素晴らしいと思います。 – Radeon348

関連する問題