簡體   English   中英

節點Js:導出可用的Mongo數據庫名稱不起作用

[英]Node Js: Exporting available Mongo database names doesn't work

我正在努力將可用的Mongo數據庫導出到./routes/index.js。

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文件中。

我建議它的原因是異步代碼執行。

您在初始化之前導出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);

由於這涉及異步操作,因此您嘗試導出的方式不起作用。 操作完成后,您必須傳遞回調以獲取數據庫。

例如。

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);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM