2013-12-06 1 views
0

Мне нужно иметь возможность экспортировать переменные для модуля, запросив значения из redis, однако я не могу понять, как это сделать асинхронно.Экспортные переменные NodeJS из запроса redis

Это то, что я пытался, где GetConfig() является функцией, которая возвращает переменные запрошенные из Redis:

var exports = {}; 
module.exports = exports; 

getconfig(function(config){ 
    exports.ConnectionString = { 
     Server: config.db.server, 
     Login: config.db.userName, 
     Database: config.db.database, 
     Password: config.db.password, 
     Port: 1433, 
     Timeout:10000 
    }; 
    exports.poolSize = 1000; 
    exports.poolIdleTimeout = 30000000; 
    exports.tdsServerPort = 88888; 
    console.log(exports); 

}) 

Но это не работает. Как я могу вернуть эти экспортные переменные?

Я попытался предложение от @Peter Lyons, используя следующий упрощенный пример:

module.exports = { 
    ConnectionString: getDb, 
    poolSize: 1000, 
    poolIdleTimeout: 30000000, 
    tdsServerPort: 88888 
} 

function getDb(cb){ 
    var dat = { 
     Server:'192.168.42.4', 
     Login: 'XXXX', 
     Database: 'MYDB', 
     Password: 'PASS', 
     Port: 1433, 
     Timeout:10000 
    }; 

    cb(null,dat); 

} 

но когда она вызывается, она возвращает строку соединения в качестве функции и не оценивается:

{ ConnectionString: [Function: getDb], 
    poolSize: 1000, 
    poolIdleTimeout: 30000000, 
    tdsServerPort: 88888 } 
+0

'require' является синхронным. Вызовы базы данных асинхронны. Это ваша основная проблема, с которой вам нужно обратиться. Во втором фрагменте вы ссылаетесь на 'getDb' без парсеров, поэтому он не выполняется, и также нет обратного вызова, поэтому даже если бы он выполнялся, он не работал бы, как вы надеетесь. –

ответ

0

Модули предназначены для кода и статических данных. Функции, константы и т. Д. Данные из баз данных не входят в состав экспорта модулей. Это необычно нетрадиционно и несколько нелогично. Однако обычная и простая процедура - это функция, которая запрашивает и использует базу данных и вызывает обратный вызов с результатами.

function getConnectionString(callback) { 
    getConfigFromRedis(function (error, config) { 
    if (error) { 
     callback(error) 
     return 
    } 
    var connectionString = { 
     Server: config.db.server, 
     ......etc 
    } 
    callback(null, connectionString) 
    }) 
} 

module.exports = { 
    getConnectionString: getConnectionString 
} 
+0

Спасибо, да проблема в том, что разработчик модуля считывает параметры конфигурации из импортированного модуля, однако все мои данные конфигурации хранятся в REDIS. Я могу учить их модуль, но до сих пор с этим приложением я не взломал какие-либо модули, чтобы я мог обновить без проблем. – crankshaft

+0

Можете ли вы получить настройки из redis в сценарии оболочки, а затем установить их как переменные среды перед выполнением вашего приложения? –

+0

Спасибо, знаете ли вы, почему строка соединения выше возвращается как функция и не оценивается ?? – crankshaft

0

Это звучит, как вы используете другой модуль, который работает следующим образом:

var my_module = require('my_module'); 
var thing = require('thing')(my_module); 

Если это так, то вам придется обернуть свой код каким-то образом, либо как Питер Лайонс описал в своем ответить на комментарий, или вот так.

/////// in your module /////// 
module.exports = { 
    ConnectionString: {}, 
    poolSize: 1000, 
    poolIdleTimeout: 30000000, 
    tdsServerPort: 88888 
} 

function setup(cb){ 
    // just using GET to simplify because I have no idea how your db is set up 
    redis_client.get('connection_data_key', function(err, result) { 
    exports.ConnectionString = result; 
    cb(err); 
    }.bind(this)); 
} 


////// in your main code ////// 
var my_module = require('my_module'); 
my_module.setup(function(err) { 
    var thing = require('thing')(my_module); 
    // the rest of your code dependent on 'thing' goes here 
}); 
Смежные вопросы