Присвоение возвращаемого результата для функции в другом файле переменной
У меня есть функция в файле утилит, которую я хочу вызвать и назначить экспортированный результат переменной.
В настоящее время переменная определена, тогда я пытаюсь присвоить возвращаемый результат, но я получаю неопределенный результат, когда я его консоль.log.
Вот мой файл утилит / консула
var consul = require("consul")({host: config.consul.host'});
var consulBase = [];
var options;
module.exports = {
consulQuery: function(service){
consul.catalog.service.nodes(service, function(err, results) {
if(err) {console.log(err); throw err;}
if(results.length <= 0) return {message: `Error could not find any service of ${service} registered with consul,`, errorCode: 500};
if(results.length > 0) consulBase = [];
results.forEach((result) => {
consulBase.push(result.ServiceAddress+ ':' +result.ServicePort);
});
var serviceURL = 'http://' + consulBase[Math.floor(Math.random()*consulBase.length)];
return options = {
baseUrl : serviceURL,
form: {'':''},
headers: {authorization: ''}
};
});
}
Затем в другом файле я звоню вот так и пытаюсь присвоить значение 'options', но получаю неопределенное значение.
var consulQuery = require("../utils/consul").consulQuery;
// Get options array right away
var options = consulQuery('auth');
// Get options array every 5 seconds
setInterval(() => {
options = consulQuery('auth');
console.log(options);
}, 5 * 1000);
1 ответ
ОК, у вас есть пара вопросов.
Во-первых, концептуально о том, что вы пытаетесь сделать. Второе - это то, что вам действительно нужно изменить в своем коде, чтобы он работал.
Я не буду говорить о первой части, потому что есть много хороших ресурсов, чтобы узнать об асинхронности с примерами лучше, чем я могу сделать здесь.
Для актуальных проблем с вашим кодом:
- Вы пропускаете обратный вызов для consulQuery()
Это должно быть что-то вроде этого (обратите внимание на добавленный мной cb):
module.exports = {
consulQuery: function (service, cb) {
consul.catalog.service.nodes(service, function (err, results) {
if (err) {
console.log(err);
cb(err, null)
throw err;
}
if (results.length <= 0) return {
message: `Error could not find any service of ${service} registered with consul,`,
errorCode: 500
};
if (results.length > 0) consulBase = [];
results.forEach((result) => {
consulBase.push(result.ServiceAddress + ':' + result.ServicePort);
});
var serviceURL = 'http://' + consulBase[Math.floor(Math.random() * consulBase.length)];
cb(null, {
baseUrl: serviceURL,
form: {'': ''},
headers: {authorization: ''}
});
});
}
}
Во-вторых, в другом файле, в котором вы вызываете функцию, вам теперь нужно будет передать функцию обратного вызова.
options = consulQuery('auth', (err, response) => {
if(err){
console.log(err)
}
console.log(response)
});