2017-02-22 2 views
0

横切るMongoDBの接続を永続与えられる以下app.jsコード:すべてのNode.jsルータモジュール

var express = require('express'); 
 
var app = express(); 
 
var mongodb = require('mongodb'); 
 

 
var db = null; 
 

 
mongodb.MongoClient.connect('mongodb://localhost/mysite', function(err, database) { 
 
    if(err) throw err; 
 
    
 
    db = database; 
 

 
    app.listen(3000); 
 
    console.log('Listening on port 3000'); 
 
}); 
 

 
var outside = require('./outside'); 
 
app.use('/outside', outside); 
 

 
app.get('/inside', function(req, res) { 
 
    collection = db.collection('pages'); 
 
    collection.find({}, function(err, data) { 
 
     if(data) { 
 
      res.send('inside worked'); 
 
     }else { 
 
      console.log('oops'); 
 
     } 
 
    }); 
 
});

とoutside.jsコードは次のように

var express = require('express'); 
 
var router = express.Router(); 
 

 
router.get('/', function(req, res) { 
 
    collection = db.collection('pages'); 
 
    collection.find({}, function(err, data) { 
 
     if(data) { 
 
      res.send('outside worked'); 
 
     }else { 
 
      console.log('oops'); 
 
     } 
 
    }); 
 
}); 
 

 
module.exports = router;

"var db = null"と表示されている場合、アプリにローカルであり、内部ルートが実行されているときに利用可能ですが、外部ルートでは使用できません。

"db = null"を使用してグローバルにすると、両方のルートで使用できます。私はそれが正しい/最もエレガントな方法であるかどうかはわかりません。もしそうなら、私に知らせてください。そうでなければ、より良い方法を教えてください。私は新しい接続を毎回作成したくないと思っています。プールの利点を利用したいと思っています。他の同様の投稿にコメントパー

、私はapp.jsに行を変更:

デシベル=データベース; 〜 db =データベース。 app.locals.db = database;

とoutside.jsに行を追加:

var db = req.app.locals.db; 

をので、今読み出し: VARのDB = req.app.locals.dbと、 コレクション= db.collection( 'pages');

これはうまくいきますが、他の投稿に記載されているように、接続を再利用するか新しいものを開くか、接続プールを正しく使用するかどうかはわかりません。私はこのプロジェクトでやったことは以下の通りであった

答えて

0

「のinit-mongoose.js」と呼ばれる別のjsファイルに - セパレート接続

const connection = mongoose.connect("mongoURL") 
module.exports = connection 

を接続-Require私がしたいときこのモデルの利点の

const connection = include('libs/init-mongoose.js') 

一つにそれを使用することで、コードの一部に接続をクローズする必要がある場合は、この接続を共有するコードのすべての部分が密接にそれを持っているということですd。私の場合は、1回の呼び出しで複数のnodejsバッチスクリプトを実行していたし、最後のスクリプトで接続を終了するために必要な

は、私の答えはあなたがすべてのファイルの接続を必要とせずに、それをも行うことができます

+0

おかげで使用することができます。既存の接続と接続プールをアプリケーション全体で使用するか、使用するたびに新しい接続を開きますか? –

+0

アプリケーション全体で接続を使用しました。私の答えが役に立つなら、/ upvote;を受け入れてください) –

+0

ありがとうイスラエル。私はあなたの答えをupvoted。私はこれに新しいので、私はこれを受け入れる前にこれが最善の答えであると言うよりも知識が豊富な人からのコメントを待つのは大丈夫ですか? –

0

役立ちました願っています。グローバル

global.connection = mongodb.MongoClient.connect('mongodb://localhost/mysite',function(err,database) { 
    if(err) throw err; 

    db = database; 

    app.listen(3000); 
    console.log('Listening on port 3000'); 
}); 

に接続変数を格納し、あなたはそれが

router.get('/', function(req, res) { 
    global['collection'] = db.collection('pages'); 
    global['collection'].find({}, function(err, data) { 
     if(data) { 
      res.send('outside worked'); 
     }else { 
      console.log('oops'); 
     } 
    }); 
}); 
+0

Ashishに感謝します。これは、ローカル変数とグローバル変数の使用について私の記事で述べたことと似ています。グローバル変数を使用することには欠点がありますか? –

+0

はい、いくつかの欠点があります。このソリューションでは、この接続変数は常に有効になり、メモリユニットのスペースを占有してアプリを再起動します。小さい値やデータを格納することはそれほど大きな影響を与えませんが、大量のデータを格納するとマシンのメモリスペースが減少します。 –

関連する問題