2016-12-05 2 views
1

Я изо всех сил пытаюсь экспортировать доступные базы данных Mongo в ./routes/index.js.Узел Js: Экспорт доступных имен базы данных Mongo не работает

Связанные часть app.js:

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»); означает? Я хотел бы запросить существующие dbs при запуске и настроить соединения, т. Е. Var monk = require ('monk'); var TEST_DB1 = monk ('localhost: 27017/TEST_DB1'); а также я хотел бы экспортировать его, чтобы избежать повторений кода. – Angelo

+0

@Angelo проверить мое обновление –

+0

code-jaff: Вы частично поняли мою проблему. Я хотел бы запросить существующие базы данных в самом файле app.js, чтобы установить подключения к ним и сделать их доступными для клиентских запросов, а рядом с ним я также хотел бы импортировать доступные dbs в файл index.js, где запросы определены для клиентской стороны, чтобы избежать избыточности кода. Я также могу сделать это в файле приложения, это не имеет значения, но из-за асинхронного режима построения соединений не происходит. – 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); 
Смежные вопросы