Обработка ошибок при открытии PDF в Node

Я пытаюсь открыть файл PDF, созданный третьей стороной, который, как я знаю, иногда терпит неудачу. Я пробую как pdf2json, так и pdfreader, и сталкиваюсь с той же проблемой, в которой я не уверен, так ли я пытаюсь обрабатывать библиотеки в обещании.

Когда я получаю PDF-файл, я хочу открыть его, чтобы убедиться, что это действительный PDF-файл, прежде чем передавать его на обработку.

Я так делаю:

function printRawItems(filename, callback){
new pdfReader.PdfReader().parseBuffer(filename, function(err, item) {
    if (err) {
        callback(err);
    } else if (!item) {
        callback();
    } else if (item.text) {
        callback(null, item)
    } else if (item.page){
        console.info("page  = ", item.page);
        callback(null, item);
    } else if (item.x){
        console.info([item.x, item.y, item.oc, item.A, Math.floor(item.w), item.text].join("\t"));
        callback(null, item);
    } else {
        console.warn(item);
    }
});
}

function isValidPdf(buffer) {
return new Promise((resolve, reject) => {
    printRawItems(buffer, function(err, item){
        if (err) {
            return reject(err);
        } else if (item) {
            return resolve(item);
        }
        return reject();
    })
}).catch(err => {throw err})
}

Буфер, передаваемый в isValidPdf, получен из HTTP-запроса.

Теперь из того, что я могу сказать, обратный вызов, который я передаю в parseBuffer, запускается дважды. Один раз, когда файл открывается (и поэтому элемент является "файлом"), и второй, когда он анализируется. После первого прохода обещание в isValidPdf разрешается, а переданный обратный вызов никогда не вызывается, поэтому он не отклоняется. Второй запуск обратного вызова parseBuffer отображает ошибки, которые вызывают исключение, но к этому времени обещание выполняется и происходят плохие вещи.

Я неправильно понимаю, как работают обратные вызовы, или эти библиотеки делают что-то не так, и я должен открыть заявку в службу поддержки?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
548
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы правильно понимаете, как работают обратные вызовы. Просто неправильно их использовать. Я быстро взглянул на pdf2json, и кажется, что вы сначала создаете синтаксический анализатор, затем делаете .parseBuffer() и ждете, пока сработают события, например:

function printRawItems (buffer, cb) {                                                                                                                                                                                
  const parser = new PDFParser()                                                                                                                                                                                     
  parser.on('pdfParser_dataError', errData => {                                                                                                                                                                      
    cb(errData.parserError)                                                                                                                                                                                          
  })                                                                                                                                                                                                                 
  parser.on('pdfParser_dataReady', pdfData => {                                                                                                                                                                      
    cb(null, pdfData)                                                                                                                                                                                                
  })                                                                                                                                                                                                                 
  parser.parseBuffer(buffer)                                                                                                                                                                                         
}

Спасибо за ответ. Если вернуться к pdf2json из pdfreader и использовать ваш пример, он немедленно завершится.

Chris 16.03.2018 00:59

Как выйти немедленно?

ralphtheninja 16.03.2018 01:03

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

Chris 16.03.2018 01:06

Спасибо, я принял это, поскольку это помогло мне подтвердить мои опасения, что библиотека работает не так, как ожидалось. Я могу запустить 0-байтовые PDF-файлы, и они вернут ошибку, и я могу просмотреть правильные PDF-файлы, и они правильно проанализируют. Поврежденный PDF-файл немедленно закрывается и не вызывает исключения, с которым я могу справиться.

Chris 16.03.2018 10:31

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