TypeError [ERR_INVALID_ARG_TYPE]: "исходный" аргумент должен иметь тип function - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь использовать Puppeteer v5.0.0 для создания PDF-файлов страницы моего приложения. Чтобы запустить команду для запуска процесса, я использую класс Process Symfony. Команда работает нормально, когда я набираю ее вручную в командной строке, но не работает при использовании Symfony.

Я пробовал

  • Обновление версии узла до v12.18.3 которые мне рекомендовали сделать некоторые сообщения
  • Используя общий c веб-сайт, например https://google.com
  • Используя php s exec, но я бы хотел использовать Symfony из-за очистки входа
  • Изменение пути к выходному файлу на public/file.pdf (может быть, права /tmp были неправильными?)
  • Понижение кукловода до версии 4.0.0

Вот код для запуска команды:

 $path = base_path();
        $filePath = '/tmp/pagePdf-'.time().'.pdf';
        $url = route('render.page', $request->all());

        $process = new Process(["node", "$path/resources/assets/js/takePdf.js", $url, $filePath]);
        $process->setTimeout(60);

        try{
            $process->mustRun();
            $process->wait();

            if(file_exists($filePath)){
                return response()->download($filePath)->deleteFileAfterSend();
            }else{
                return redirect()->back();
            }
        }catch(ProcessFailedException $e){
            Log::info($e->getMessage());
            report($e);

            return redirect()->back();
        }

Это takePdf.js:

const puppeteer = require('puppeteer');
const dotenv = require('dotenv').config();

(async() => {
    const browser = await puppeteer.launch({
        headless: true,
        executablePath: '/usr/bin/chromium-browser',
        ignoreHTTPSErrors: true,
        args: [
            '--no-sandbox',
            '--disable-setuid-sandbox',
        ],
    });

    // Parse arguments
    var args = process.argv;
    var indexes = [2,3];
    var arg_index = {};

    arg_index[2] = 'URL';
    arg_index[3] = 'File Path';

    indexes.forEach(function(index){
        if(typeof args[index] == 'undefined'){
            var parameter = arg_index[index];
            console.log('Missing Parameter: ' + parameter);
            browser.close();
            process.exit(1);
        }
    });

    var url = args[2] + '&token=' + process.env.RENDER_TOKEN;
    var filePath = args[3];

    const page = await browser.newPage();
    await page.emulateMediaType('screen');
    await page.setViewport({
        width: 800,
        height: 600,
        deviceScaleFactor: 1,
    });
    await page.goto(url, {waitUntil: 'networkidle2'}).catch(e => void 0);
    await page.waitFor(1000);
    await page.pdf({
        path: filePath,
        format: 'A4',
        printBackground: true,
        width: '1920px',
        height: '1080px'
    });

    await browser.close();
})();

При достижении конечной точки это исключение, которое я получаю обратно из процесса. Опять же, запуск из командной строки работает нормально.

internal/util.js:209
        throw new errors.TypeError('ERR_INVALID_ARG_TYPE', 'original', 'function');
        ^
    
    TypeError [ERR_INVALID_ARG_TYPE]: The "original" argument must be of type function
        at promisify (internal/util.js:209:11)
        at Object.<anonymous> (/home/forge/default/releases/20200709194844/node_modules/extract-zip/index.js:11:18)
        at Module._compile (module.js:652:30)
        at Object.Module._extensions..js (module.js:663:10)
        at Module.load (module.js:565:32)
        at tryModuleLoad (module.js:505:12)
        at Function.Module._load (module.js:497:3)
        at Module.require (module.js:596:17)
        at require (internal/module.js:11:18)
        at Object.<anonymous> (/home/forge/default/releases/20200709194844/node_modules/puppeteer/lib/cjs/node/BrowserFetcher.js:48:39)

1 Ответ

0 голосов
/ 14 июля 2020

При запуске процесса он пытался использовать другую версию узла, командная строка вернула более высокую версию узла по сравнению с командой. Чтобы исправить это, мне пришлось передать процессу правильный путь узла.

$process = new Process(["/path/to/node", "$path/resources/assets/js/takePdf.js", $url, $filePath]);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...