2016-12-05 42 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'函數中工作。 (我想在app.js文件,以便遷移代碼到index.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');」代表?我想在啓動時查詢現有的數據庫並設置連接,即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); 
相關問題