Используйте функцию puppeeter в облаке для длительной работы

# #node.js #google-cloud-functions #puppeteer

Вопрос:

Я разрабатываю некоторые облачные функции на облачной платформе Google. Мне нужно очистить веб-страницу, затем я решил использовать облачные функции NodeJS с кукловодом.

Мой скребок выполняет работу, которая занимает от 1 до 3 минут.

Моя идея состояла в том, чтобы запустить функцию с помощью вызова API, вернуть сообщение об успешном выполнении, а затем очистить страницу и сохранить данные в базе данных.

Ниже приведен мой код.

 const puppeteer = require('puppeteer');


async function browserPromise() {
    return await puppeteer.launch({
        args: [
            "--ignore-certificate-errors",
            "--no-sandbox",
        ],
        headless: true
    })
}

exports.Runner = async (req, res) => {

    const browser = await browserPromise();
    const page = await browser.newPage();
    await page.setViewport({width: 1200, height: 720});

    scraper(browser, page, req.body)

    res.json('OK')
}


async function scraper(browser, page, formdata) { 
...do stuff...
}
 

Проблема в том, что когда я запускаю приведенный выше код, я получаю ответ «ОК», но код внутри скребка всегда завершается со следующей ошибкой

 Error: Process exited with code 16
    at process.<anonymous>
 

Вместо этого, если я буду ждать ответа, подобного следующему, это сработает.

 const data = await scraper(browser, page, req.body)
 

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

Как лучше всего сделать то, что мне нужно сделать?

Спасибо.

Ответ №1:

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

Вам нужно проверить, на какой шаг(ы) ушло слишком много времени.

 console.time('method1');
console.timeEnd('method1');
 

И я использую эти аргументы:

 var args = [
            '--proxy-server=' proxy,
            '--no-sandbox',
            '--disable-gpu',
            '--disable-setuid-sandbox',
            '--disable-dev-shm-usage',
            '--no-first-run',
            '--no-zygote',
            '--single-process'
        ];
 

и вы должны использовать

 scraper(browser, page, req.body)
 

вместо

 await scraper(browser, page, req.body)
 

перед отправкой ответа