2016-12-05 63 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); 
相关问题