Trabajando en un pequeño proyecto de NodeJS actualmente que involucra la biblioteca Puppeteer. El problema que tengo es que la función main() en index.js parece no salir nunca. Todo el código funciona bien, pero en el código VS parece que el programa aún se está ejecutando.
Algunos ejemplos de código a continuación:
var UserAgent = require('user-agents'); const userAgent = new UserAgent(); const puppeteer = require('puppeteer-extra'); const StealthPlugin = require('puppeteer-extra-plugin-stealth'); puppeteer.use(StealthPlugin()); class TS { constructor() { let page; } async init() { const browser = await puppeteer.launch({ headless: false }); this.page = await browser.newPage(); await this.page.setUserAgent(userAgent.toString()); } } async function main(params) { console.log("Started main.."); const ts = new TS(); await ts.init(); console.log("Ending main.."); } main().catch(e => console.error(e));;Si ejecuto el código anterior en un terminal de código VS, el resultado mostrará:
Comenzó main.. Finalizando main.. (línea en blanco)
El programa ahora permanecerá en este estado indefinidamente hasta que presione ctrl + C. Si elimino la esperada llamada ts.init(), entonces funciona como se esperaba y mi terminal muestra
Comenzó main.. Finalizando main.. PS C:\Users\username\Desktop\nodejs-projects\my-project>
¿Alguien puede explicar qué está pasando aquí?
De toda la investigación que he hecho, lo mejor que se me ocurre es algún problema con el bucle de eventos, aunque realmente no sé qué lo está causando.
Agregar un .then() a main() con algo como esto resuelve el problema
.then(() => { setTimeout(() => { process.exit(0); }, 5000);; })Esto prueba que la promesa se está resolviendo ya que se está llamando a setTimeout(). Sin embargo, si main se resuelve y no queda ningún código para ejecutar, estoy bastante perdido en cuanto a por qué el programa no finalizará automáticamente sin llamar a process.exit(). Realmente agradecería algo de ayuda.
Muy divertido. He estado buscando una solución todo el día y tan pronto como la publico en stackoverflow la encuentro.
Encontré este paquete que puede ayudar a señalar cosas como conexiones abiertas que evitan que el nodo salga: ¿por qué se está ejecutando el nodo?
A continuación, descubrí que la conexión del titiritero abierto al navegador Chrome abierto debe cerrarse con algo como esto:
async close() { await this.browser.close(); }En lugar de eliminar la pregunta, pensé en publicar esto en caso de que alguien más tenga el mismo dolor de cabeza en algún momento.