TypeError: Невозможно прочитать свойство 'parent' из неопределенного

url = "www.w3schools.com/html/html5_video.asp"

VIDEO_LINKS = [];
VIDEO_LIST = [];

function fillVideo(callback) {
  request(url, function(err, res, body) {
    if (body) {
      $ = cheerio.load(body);
    }
    links = $('source');
    $(links).each(function(i, link) {
      var value = $(link).attr('src');
      if (value.slice(-3) == "mp4" ||
        value.slice(-4) == "webm" ||
        value.slice(-3) == "ogv") {
        VIDEO_LINKS.push(value);
        VIDEO_LIST.push($(link).text());

      }

    })
    callback();
  });
}

function writeVideo() {

  for (j = 0; j < VIDEO_LIST.length; j++) {
    request(VIDEO_LINKS[j]).pipe(fs.createWriteStream(VIDEO_LIST[j]));
  }
}

fillVideo(writeVideo);

//www.electronicinfo.ca/printable-pdfs

PDF_LINKS = [];
PDF_LIST = [];

function fillPDF(callback) {
  request(url, function(err, res, body) {
    $ = cheerio.load(body);
    links = $('a');
    $(links).each(function(i, link) {
      var value = $(link).attr('href');
      if (value.slice(-3) == "pdf") {
        PDF_LINKS.push(value);
        PDF_LIST.push($(link).text());
      }
    })
    callback();
  });
}

function writePDF() {
  for (j = 0; j < PDF_LIST.length; j++) {
    request(PDF_LINKS[j]).pipe(fs.createWriteStream(PDF_LIST[j]));
  }
}

fillPDF(writePDF);

Привет, это код, который работал, я буквально ничего не изменил, примерно 5 минут назад, единственное, что я изменил, это его дублирование и изменение имен переменных. Мой вопрос, как исправить этот код? Я знаю, что ошибка в том, что тело пустое, но я не знаю, как это исправить, я бы попросил любую помощь...

1 ответ

Решение

Ошибки:

  1. Неверный URL из-за неуказанного протокола. Я только что проверил ваш код, и request выдает эту ошибку:

Ошибка: неверный URI "www.w3schools.com/html/html5_video.asp".

  1. Ссылки извлечены из <source> элементы относительны. Эта ссылка поможет вам понять и решить проблему.
  2. <source> элемент сам по себе не имеет текста. Вы должны будете использовать тот из URL, используя Url.parse(src).pathname,
  3. Обработка ошибок и ошибки, связанные с некоторыми переменными: необъявленные переменные, неинициализированные переменные и глобальные переменные, которые создают глобальную область видимости и потенциально могут вызвать другие проблемы.

Fix:

Вы должны указать протокол (http, https,...) для URL.

Кроме того, ваш код нуждается в небольшой очистке (объявление переменных, удаление глобальных переменных, ...):

var Url = require("url");
// ...

function fillVideo(url, callback) {
    request(url, function(err, res, body) {
        if(err) {
            return callback(err, null);                         // or throw an error if you like
        }

        var $ = cheerio.load(body),
            result = [];
        $('source').each(function() {
            var $this = $(this),
                src = $this.attr("src");
            if(/(?:mp4|webm|ogv)$/i.test(src)) {
                result.push({
                    url: Url.resolve(url, src),                 // make the url absolute
                    text: Url.parse(src).pathname
                });
            }
        });

        callback(null, result);
    });
}

Тогда используйте это так:

fillVideo("http://www.w3schools.com/html/html5_video.asp", function(err, videos) {
    if(err) {
        console.log("Error: ", err);
        return;
    }

    videos.forEach(function(video) {
        request(video.url).pipe(fs.createWriteStream(video.text));
    });
});

Замечания:

Всегда проверяйте / регистрируйте err объект обратных вызовов. Они точно говорят, что не так с вашим кодом. В этом случае этот URI является недействительным, что на самом деле является истиной.

Другие вопросы по тегам