2016-12-05 9 views
1

利用可能なMongoデータベースを./routes/index.jsにエクスポートするのに苦労しています。 app.jsのノードJs:利用可能なMongoデータベース名をエクスポートできません

関連部品:

var ACCESSIBLE_DATABASES = []; 
var Db = require('mongodb').Db, 
    MongoClient = require('mongodb').MongoClient, 
    Server = require('mongodb').Server, 
    assert = require('assert'); 

var db = new Db('test', new Server('localhost', 27017)); 

db.open(function(err, db) { 
    var existing_databases = []; 
    var adminDb = db.admin(); 

// List all the available databases 
    adminDb.listDatabases(function(err, dbs) { 
     assert.equal(null, err); 
     assert.ok(dbs.databases.length > 0); 
     ACCESSIBLE_DATABASES = dbs.databases; 
     db.close(); 
    }); 
}); 
// Code below export empty array 
module.exports.accessible_databases = ACCESSIBLE_DATABASES; 

// After some milisec the array has already contain the databases 
setTimeout(function() { 
    console.log(ACCESSIBLE_DATABASES); 
}, 100); 

私は私のindex.jsファイルのコードの重複を避けるしたいのですが、私はそれを達成することができませんでした。インポートは、 'adminDb.listDatabases'関数の中でも、後で 'setTimeout'関数でも機能しません。 (私はそうindex.jsファイルにコードを移行することはオプションではありません、後でapp.jsファイルに結果を使用するようにしたいのです。

を私はそれの理由は、非同期コードの実行であることを示唆している。

答えて

0

これは非同期操作を伴うので、あなたが仕事ではないでしょう輸出しようとしている道をあなたはよデータベースを取得するコールバックを渡す必要があります操作が完了したら

たとえば、

function getDBs(db, adminDb, callback) { 
    // List all the available databases 
    adminDb.listDatabases(function(err, dbs) { 
     assert.equal(null, err); 
     assert.ok(dbs.databases.length > 0); 
     db.close(); 
     callback(null, dbs); 
    }); 
} 

function openHandler(callback) { 
    return function(err, db) { 
     var adminDb = db.admin(); 
     getDBs(db, adminDb, callback); 
    } 
} 

module.exports.databases = function(callback) { 
    db.open(openHandler(callback)); 
} 

// usage in routes/index.js 
const dbs = require('./app').databases; 
dbs(function(err, availableDBs) { 
    console.log(availableDBs); 
}); 
+0

「const dbs = require( './ dbs');」とは何ですか?を意味する?私は起動時に既存のDBに照会して接続を設定したいと思います。var monk = require( 'monk'); var TEST_DB1 = monk( 'localhost:27017/TEST_DB1');コードの繰り返しを避けるためにエクスポートしたいと思います。 – Angelo

+0

@Angelo私の更新を確認してください –

+0

code-jaff:あなたは私の問題を部分的に理解していました。私はapp.jsファイル自体の既存のデータベースにクエリを行い、それらへの接続を確立し、それらをクライアント要求に利用できるようにしたいと思います。また、index.jsファイルにアクセス可能なdbsをインポートすることもできますコードの冗長性を避けるためにクライアント側で定義されています。私はアプリファイルでもそれを作ることができますが、それは問題ではありませんが、非同期モードの構築のために接続は起こっていませんでした。 – Angelo

0
それが初期化される前

あなたはaccessible_databasesオブジェクトをエクスポートしている

をこのような何か試してみてください:。。

var DB_OBJ = {}; 
adminDb.listDatabases(function(err, dbs) { 
    assert.equal(null, err); 
    assert.ok(dbs.databases.length > 0); 
    //export the array here 
    DB_OBJ.accessible_databases = ACCESSIBLE_DATABASES = dbs.databases; 
    db.close(); 
}); 

module.exports = DB_OBJ; 
// After some milisec the array has already contain the databases 
setTimeout(function() { 
    console.log(ACCESSIBLE_DATABASES); 
}, 100); 
関連する問題