Присвоение возвращаемого результата для функции в другом файле переменной - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть функция в файле утилит, которую я хочу вызвать и назначить экспортированный результат переменной.

В настоящее время переменная определена, тогда я пытаюсь присвоить возвращаемый результат, но я получаю неопределенный результат в результате того, что я его укажу.*

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 Ответ

0 голосов
/ 09 февраля 2019

ОК, у вас есть пара проблем.

Во-первых, концептуально о том, что вы пытаетесь сделать.Второе - это то, что вам действительно нужно изменить в своем коде, чтобы он работал.

Я не буду говорить о первой части, потому что есть много хороших ресурсов, чтобы узнать об асинхронности с примерами лучше, чем я могу сделать здесь.

Для реальных проблем с вашим кодом:

  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)

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...