# #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)
перед отправкой ответа