node js извлекает данные из тела

Привет, я только начал изучать node.js и javascript. И я пытаюсь получить данные с URL-адреса с помощью node-fetch, а затем пытаюсь выполнить json-анализ данных, но я продолжаю получать возврат undefined.

Я пытаюсь получить данные из переменной game из приведенного ниже html, а затем преобразовать в строку, а затем проанализировать json, но он возвращает undefined.

И я надеялся, что, может быть, кто-нибудь поможет мне понять, почему?

Код html не мой. Я пытаюсь получить данные с сайта, который не контролирую.

HTML страницы:

<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8" />
    <title>Document Title</title>
  </head>
  <body>
    <div id="hud-div">
      <p>Welcome to the blah blah blah blah text here</p>
    </div>
    <script>
      var game = new Game({
        stage: "prod",
        servers: {
          v32306117: {
            id: "v32306117",
            region: "region 1",
            name: "region #1",
            hostname: "hostname1",
            port: 80,
            fallbackPort: 8000,
            population: 97,
            selected: false
          },
          v32306125: {
            id: "v32306125",
            region: "region 2",
            name: "region #2",
            hostname: "hostname2",
            port: 80,
            fallbackPort: 8000,
            population: 38,
            selected: false
          }
        },
        userGroup: 0
      });

      game.init(function() {
        game.assetManager.load([{
          "name": "\/asset\/image\/map\/grass.png",
          "url": "\/asset\/image\/map\/grass.png"
        }]);

        game.debug.init();
        game.run();
      });

    </script>
  </body>
</html>

Функция извлечения:

    const fetch = require("node-fetch");

    async function serversFetch() {
      try {
        const servers = await fetch("https://get-servers.herokuapp.com/");
        const data = await servers.text();
        const servers_data = data.substring(
          data.lastIndexOf("var game =") + 20,
          data.lastIndexOf("game.init") - 10
        );

        return JSON.stringify(servers_data);
      } catch (error) {
        console.log(error);
      }
    }

    (async () => {
      const data = await serversFetch();
      console.log('data', data);

      const info = JSON.parse(data);
      console.log('info', info.servers); // returns undefined
    })()

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

info {
        stage: "prod",
        servers: {
          v32306117: {
            id: "v32306117",
            region: "region 1",
            name: "region #1",
            hostname: "hostname1",
            port: 80,
            fallbackPort: 8000,
            population: 97,
            selected: false
          },
          v32306125: {
            id: "v32306125",
            region: "region 2",
            name: "region #2",
            hostname: "hostname2",
            port: 80,
            fallbackPort: 8000,
            population: 38,
            selected: false
          }
        },
        userGroup: 0
      }

Я сделал пример сайта с использованием herokuapp для всех, кто хочет помочь.


person GaiterLeg    schedule 23.08.2020    source источник


Ответы (1)


Я бы не рекомендовал смешивать async/await и .then. Вот метод работы с ожиданиями для получения данных.

        const servers = await fetch("https://get-servers.herokuapp.com/");
        const data = await servers.text();
        // Work with data logic
person jasonandmonte    schedule 23.08.2020