尝试对远程URL进行http调用

时间:2019-06-25 13:55:44

标签: node.js express

我正在尝试在node.js应用程序中对外部URL进行远程调用,然后解析该请求并根据返回结果执行操作。我正在使用express和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:我编辑了代码,并直接在main函数上进行了提取,但是我仍然收到不一致的结果,例如某处是否有某种缓存。

1 个答案:

答案 0 :(得分:0)

我不确定我是否理解正确,但是您可以尝试使用Promise.all()函数来等待所有提取请求完成,然后再执行操作。

Promise.all(
  result.map(row => {
    var urlMon = 'http://' + row.pip + ':8000/PING/' + ipsv;
    monitora(urlMon, idsv);
  })
).then(result => result /*Do something */);