Является ли эта ошибка проблемой асинхронности / сбоя: значение undefined находится вне диапазона для неопределенного свойства option undefined? - PullRequest
1 голос
/ 25 апреля 2020

Я работаю над инструментом PDF, который конвертирует страницы в изображения base64. Однако при обработке большого файла (более тысячи страниц) я получаю эту ошибку:

RangeError: Value undefined out of range for undefined options property undefined
    at Map.set (<anonymous>)
    at AsyncHook.init (domain.js:68:15)
    at PromiseWrap.emitInitNative (internal/async_hooks.js:142:43)
    at Function.all (<anonymous>)
    at next (/Users/grumbaut/Documents/repos/pub/packages/build/node_modules/pdfjs-dist/build/pdf.worker.js:31649:19)
    at promiseBody (/Users/grumbaut/Documents/repos/pub/packages/build/node_modules/pdfjs-dist/build/pdf.worker.js:31937:15)
    at /Users/grumbaut/Documents/repos/pub/packages/build/node_modules/pdfjs-dist/build/pdf.worker.js:31651:15
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

Я использую PDF. js для разделения PDF и обработки страницы. Метод render, который я вызываю для каждой страницы, возвращает обещание. Интересно, является ли длина числа обещаний причиной вышеуказанной ошибки.

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

// Split the PDF
const { numPages } = pdf;
const convert = async (num) => pdf
    .getPage(num)
    .then((page) => {
        const pageObject = {
            contents: page,
            pageNum: `${vinylPath}`,
            origin: filename,
        };
        this.pdfPages.push(pageObject);
        vinylPath += 1;
    });
let promise = Promise.resolve();
for (let i = 1; i <= numPages; i += 1) {
    promise = promise.then(() => convert(i));
}
return promise.then(() => {
    cb();
});
// call the render method for each page
const renderPagesPromise = (pageObj) => new Promise((resolve, reject) => {
const { contents: page, origin, pageNum } = pageObj;

if (this.args.debug) {
    this.log(
        taskName,
        `Converting page ${pageNum} of ${origin} to base64.`,
    );
}
const viewport = page.getViewport({ scale: 1.5 });
const canvasFactory = new CanvasFactory();
const canvas = canvasFactory.create(viewport.width, viewport.height);

const renderContext = {
    canvasContext: canvas.context,
    viewport,
    canvasFactory,
};

page
    .render(renderContext)
    .promise
    .then(() => {
        const contents = {
            contents: canvas.canvas.toBuffer().toString('base64'),
        };
        streamLog(taskName, `Converted page ${pageNum} of ${origin} to base64.`);
        base64.push({ ...pageObj, ...contents });
        resolve();
    });
});

const task = () => {
    const doNext = () => {
        if (!pdfPages.length) return;
        const page = pdfPages.shift();
        renderPagesPromise(page).then(doNext);
    };
    doNext();
};

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

...