Tengo una función de Firebase para crear un archivo PDF. ¿Últimamente, se agotó el tiempo de espera debido a una "revisión de Chrome"? Ni entiendo el mensaje de error, ni entiendo lo que está mal. La función funciona cuando la implemento localmente en MacOS.
TimeoutError: Timed out after 30000 ms while trying to connect to the browser! Only Chrome at revision r818858 is guaranteed to work. at Timeout.onTimeout (/workspace/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:204:20) at listOnTimeout (internal/timers.js:549:17) at processTimers (internal/timers.js:492:7)La función:
const puppeteer = require('puppeteer'); const createPDF = async (html, outputPath) => { let pdf; try { const browser = await puppeteer.launch({ args: ['--no-sandbox'] }); const page = await browser.newPage(); await page.emulateMediaType('screen'); await page.setContent(html, { waitUntil: 'networkidle0' }); pdf = await page.pdf({ // path: outputPath, format: 'A4', printBackground: true, margin: { top: "50px", bottom: "50px" } }); await browser.close(); } catch (e) { console.error(e); } return pdf; };TimeoutError: ¡Se agotó el tiempo de espera después de 30000 ms al intentar conectarse al navegador!
El error antes mencionado proviene del hecho de que, como se menciona en la documentación :
Cuando instala Puppeteer, descarga una versión reciente de Chromium
Cada vez que ejecuta Puppeteer, está ejecutando un Chromium en el backend al que Puppeteer intentará conectarse, por lo tanto, cuando no puede conectarse al navegador, surgen estos errores.
Después de realizar varias pruebas, pude ejecutar Cloud Function agregando el parámetro headless en la opción de inicio, ya que la documentación menciona que debería ser true de forma predeterminada. No entiendo muy bien por qué configurarlo manualmente permite que Cloud Function finalice correctamente. . Al principio estaba intentando con el tiempo de timeout puesto a 0 para deshabilitar el error por tiempo de espera, sin embargo parece que no es necesario, ya que con solo agregar headless terminó correctamente, pero si encuentras el mismo problema con los tiempos de espera puedes agregar eso. Al final mi código se ve así:
const createPDF = async (html, outputPath) => { let pdf; try { const browser = await puppeteer.launch({ args: ['--no-sandbox'], headless: true, timeout: 0 }); const page = await browser.newPage(); await page.emulateMediaType('screen'); await page.setContent(html, { waitUntil: 'networkidle0' }); pdf = await page.pdf({ // path: outputPath, format: 'A4', printBackground: true, margin: { top: "50px", bottom: "50px" } }); await browser.close(); console.log("Download finished"); //Added this to debug that it finishes correctly } catch (e) { console.error(e); } return pdf; };