1

アプリ全体でdb.openまたはdb.connectを呼び出したときに返されたdbオブジェクトを共有するにはどうすればよいですか?

私は次のようにdbconnect.jsモジュールを持っています:

var mongodb = require('mongodb');
var global_db  = '';

// Define options. Note poolSize.
var serverOptions = {
   'auto_reconnect': true,
   'poolSize': 5
};

// Now create the server, passing our options.
var serv = new mongodb.Server('localhost', 27017, serverOptions);

// At this point, there is no connection made to the server.

// Create a handle to the Mongo database called 'myDB'.
var dbManager = new mongodb.Db('myDB', serv);

// NOW we initialize ALL 5 connections:
dbManager.open(function (error, db) {
  // Do something with the connection.
  global_db = db;
  // Make sure to call db.close() when ALL connections need
  // to be shut down.
  db.close();
});

function getConnection()
{
   return global_db;
} 

exports.getConnection = getConnection;

そして私は私のapp.jsでこのdbconnect.jsを次のように使用しています:

var http = require('http');
var db = require('./dbconnect').getConnection();
var collection = db.collection('testcollection');
console.log(db);
console.log(collection);

var server = http.createServer();

server.on('request',route);

server.listen(8000,'127.0.0.1');

console.log('Server running at http://127.0.0.1:8000');

function route(request,response)
{
    var url = request.url;
    var doc = {};
    doc[url] = 'ok';
    collection.insert(doc,{w:1},function(err,result)
        {
            if(err) console.log(err);
            else console.log(result);
        });
}

コンソールでは、db変数とcollection変数に空の値が表示されます。また、dbconnect.jsでdb.close()呼び出しを削除しようとしましたが、役に立たなかったのですが、dbManagerのdbconnect.jsファイル内に配置すると挿入は機能します。オープン関数、これを行うにはどうすればよいですか?または同様の代替手段はありますか?

4

1 に答える 1

2

dbManager.open(は非同期メソッドであるため、これを行うことはできませんが、モジュールから同期的にデータを取得しようとしています。

これを試して:

dbconnect.jsで

var on_db_ready = null;
module.exports = {
                db_ready:function(db_ready_callback){
                     on_db_ready = db_ready_callback;
                     //here we call callback if already have db
                     if (global_db) on_db_ready(global_db);
                 },
                 getConnection:getConnection
                };
dbManager.open(function (error, db) {
 if (on_db_ready) on_db_ready(db);
  global_db= db;
})

app.jsで:

var db = require('./dbconnect').db_ready(function(db){
  //Here i have my database
  //or can use getConnection method
});

これはあまり美しい方法ではありませんが、あなたの間違いを説明してください

于 2013-03-05T09:31:27.720 に答える