асинхронная функция с ожиданием извлечения внутри цикла do-while - PullRequest
0 голосов
/ 13 марта 2019

У меня проблема с функцией ниже. Я вижу сообщения журнала следующим образом:

в fetchData
до того как
в то время как
После этого ничего не происходит, пока я не получу тайм-аут:
VM344: 1 GET http://192.168.1.91:27080/sds/deception/_find?batch_size=100&criteria={%20%22$and%22%20:%20[{%20%22$or%22%20:%20[{%20%22reason%22%20:%202%20},%20{%20%22reason%22%20:%203%20}]%20},%20{%20%22ts%22:%20{%20%22$gt%22%20:%20{%20%22$date%22%20:%201549903417360}}}]}
Net :: ERR_CONNECTION_TIMED_OUT
Ошибка типа: не удалось получить «Не удалось получить»
через некоторое время

Ценю некоторые намеки на то, что я делаю неправильно.

async function fetchData() {
    console.log("in fetchData");
    let page = 0;
    var result = [];
    var mylen;

    var hourAgo = Date.now(Date.now());           // datetime now
    hourAgo = hourAgo - 1000 * 60 * 60 * 24 * 30;   // subtract 30 days
    var myobj = {};
    myobj.ts = String(hourAgo);                     // make unix epoch in ms

    url = `http://192.168.1.91:27080/sds/deception/_find?batch_size=100&criteria={ "$and" : [{ "$or" : [{ "reason" : 2 }, { "reason" : 3 }] }, { "ts": { "$gt" : { "$date" : ${myobj.ts}}}}]}`;
    console.log("before while");
    do {
        console.log("in while");

        try {
            const response = await fetch(url);
            const res_json = await response.json();
            result = result.concat(res_json.results);
            mylen = res_json.results.length;
            if (page++ == 0) {
                url = `http://192.168.1.91:27080/sds/deception/_more?id=${res_json.id}&batch_size=100`;
                console.log(url);
            }
            console.log("Id: ", res_json.id, "\tLen: ", res_json.results.length);
        } catch (err) {
            console.log(err, err.message);
        }
    } while (mylen > 0);

    console.log("after while");

    //console.log(result);
    return result;
}

1 Ответ

0 голосов
/ 13 марта 2019

Для одного - сериализуйте ваш JSON

Я заметил, что ваш URL не закодирован (URLEncoded)

fetchData()
async function fetchData() {
  console.log("in fetchData");
  let page = 0;
  var result = [];
  var mylen;

  var hourAgo = Date.now(Date.now()); // datetime now
  hourAgo = hourAgo - 1000 * 60 * 60 * 24 * 30; // subtract 30 days
  var myobj = {};
  myobj.ts = String(hourAgo); // make unix epoch in ms

  url = `http://192.168.1.91:27080/sds/deception/_find?batch_size=100&criteria={ "$and" : [{ "$or" : [{ "reason" : 2 }, { "reason" : 3 }] }, { "ts": { "$gt" : { "$date" : ${myobj.ts}}}}]}`;
  console.log("before while");
  do {
    console.log("in while");

    try {
      console.log("URL being fetched - NOT ENCODED", url)
      let encodedURL = encodeURI(url);
      console.log("URL after ENCODING", encodedURL)
      const response = await fetch(encodedURL);
      const res_json = await response.json();
      result = result.concat(res_json.results);
      mylen = res_json.results.length;
      if (page++ == 0) {
        url = `http://192.168.1.91:27080/sds/deception/_more?id=${res_json.id}&batch_size=100`;
        console.log(url);
      }
      console.log("Id: ", res_json.id, "\tLen: ", res_json.results.length);
    } catch (err) {
      console.log(err, err.message);
    }
  } while (mylen > 0);

  console.log("after while");

  //console.log(result);
  return result;
}

Это поможет вам при кодировании URLE

https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_encodeuri

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURI

...