Используя Node.js, создайте новый XMLHttpRequest во время или после XMLHttpRequest - PullRequest
0 голосов
/ 30 октября 2018

Я очень новичок в Node.js и XMLHttpRequest, поэтому, пожалуйста, потерпите меня, если это вопрос с простым ответом.

В настоящее время я пытаюсь сканировать веб-страницу друзей (с его разрешения, конечно), на которой размещены видео и субтитры. Я хочу сделать это, написав приложение командной строки Node.js. В настоящее время я просто пытаюсь получить ссылку на видео и ссылку на субтитры. Это то, что я до сих пор:

#!/usr/bin/env node

var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var htmlparser = require("htmlparser2");

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
  if (this.readyState == 4 && this.status == 200) {

    // HTML source
    var html = this.responseText;
    var season = 0;
    var episode = 0;

    var parser = new htmlparser.Parser({
      onopentag: function(name, attribs) {
        if (name === "li" && attribs.id === "season-1") {
          season = 1;
          console.log("In season 1");
          for(var attr in attribs){
            console.log(attr);
          }
        }
        if (name === "a" && season === 1) {
          episode = 1;
          var nextPage = attribs.data;
          console.log("\""+nextPage+"\"");

          // Go to "nextPage" here
          xhttp.open("GET", "\""+nextPage+"\"", true);

        }
      },
      onattribute: function(name, value) {
        if(name === "data-url" && season === 1){
          if(value.includes("episode-")){
            episode = value.substr(8,1);
          }
          console.log(value);
          console.log("Episode is: " + episode)
        }
      },
      ontext: function(text) {

      },
      onclosetag: function(tagname) {
        if (tagname === "li" && season === 1) {
          season = 0;
          console.log("Leaving season 1");
        }
      }
    }, {
      decodeEntities: true
    });
    parser.write(html);
    parser.end();

  }
};
xhttp.open("GET", "https://friendspage.org", true);
xhttp.send();

Приведенный выше код приводит к выводу:

In season 1
id
episode-1
Episode is: 1
"https://friendspage.org/episode-1"
episode-2
Episode is: 2
"https://friendspage.org/episode-2"
episode-3
Episode is: 3
"https://friendspage.org/episode-3"
episode-4
Episode is: 4
"https://friendspage.org/episode-4"
episode-5
Episode is: 5
"https://friendspage.org/episode-5"
episode-6
Episode is: 6
"https://friendspage.org/episode-6"
episode-7
Episode is: 7
"https://friendspage.org/episode-7"
episode-8
Episode is: 8
"https://friendspage.org/episode-8"
episode-9
Episode is: 9
"https://friendspage.org/episode-9"
Leaving season 1

Код работает так, как я хочу, за исключением части, в которой я хочу перейти на nextPage. Я собираюсь использовать входные переменные из командной строки, чтобы выбрать страницу для перехода, но в настоящее время я не знаю, как перейти к nextPage.

// Go to "nextPage" here
xhttp.open("GET", "\""+nextPage+"\"", true);

Попытка использовать xhttp.send() приводит к ошибке send has already been called. Я предполагаю, что мне нужно либо закрыть текущий запрос и открыть новый, либо просто запустить другой экземпляр XMLHttpRequest.

Если это то, что мне нужно сделать, какой метод предпочтительнее? И какой самый чистый способ сделать это? Если нет, какое решение мне нужно использовать?

1 Ответ

0 голосов
/ 31 октября 2018

Создайте новый объект xhttp в новой переменной для каждого нового запроса. Не используйте текущий.

Кстати, библиотека request-promise гораздо лучше построена для node.js, чем пытаться эмулировать архаичный интерфейс из браузера (который даже был заменен на fetch()). Функциональность, встроенная в node.js для этого, - http.get(), но она была очень полезна в библиотеке request, а затем добавлена ​​в библиотеку request-promise, что делает ее еще проще в использовании. Я настоятельно рекомендую использовать библиотеку запроса-обещания для этой задачи.

...