Попытка сделать http-вызов на удаленный URL - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь сделать удаленный вызов в моем приложении node.js на внешний URL, затем проанализировать этот запрос и выполнить действие, основанное на возврате. Я использую экспресс и MySQL.

Мне удалось получить удаленный URL-адрес, однако у меня какое-то состояние гонки, когда мой вывод постоянно меняется и не является надежным. Я пытался использовать async / await, но не смог.

Эта функция вызывается для запуска приложения:

function lista(servidores) {
    return new Promise(function(resolve, reject) {
        var sql = ' SELECT sv.id as svid, sv.ip as svip'+
                  ' FROM servidores sv'     
        dbconfig.conexao.query(sql, function (err, result, fields) {
                Promise.all(
                result.map(row => {
                  var ipsv = row.svip;
                  var urlprobe = 'http://201.182.96.14:8000/PING/' + ipsv;
                  fetch(urlprobe, {
                        method: 'get',
                        headers: {
                        'Accept': 'application/json, application/xml, text/plain, text/html, *.*',
                        'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
                        },})
                    .then(
                        response => response.json(),
                        error => console.log('Ocorreu um erro', error)
                    )
                    .then(
                        json => console.log(json),
                    )
                })
              ).then(result => result);  
        return resolve();
        });
    })           
}

Когда все эти функции вызываются, все работает нормально до функции monitora (). Вывод является случайным, в зависимости от того, какой выбор отвечает быстрее, и, следовательно, результат не является надежным. Идеал в том, что monitora () выполняет каждую выборку отдельно, а затем обрабатывает if, основываясь на каждом из результатов.

@ edit: я отредактировал код и произвел выборку непосредственно в основной функции, однако я все еще получаю противоречивые результаты, например, если где-то было кэширование.

1 Ответ

0 голосов
/ 25 июня 2019

Я не уверен, правильно ли я понимаю, но вы можете попробовать использовать функцию Promise.all(), чтобы дождаться завершения всех запросов на выборку, прежде чем предпринимать какие-либо действия.

Promise.all(
  result.map(row => {
    var urlMon = 'http://' + row.pip + ':8000/PING/' + ipsv;
    monitora(urlMon, idsv);
  })
).then(result => result /*Do something */);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...