PREGUNTA:
Desafortunadamente, mi función finaliza la ejecución en segundos en lugar de ejecutarse por completo. Aparentemente, esto se debe al hecho de que se declara que los oyentes transmiten los datos: no son promesas que pueda esperar que yo sepa.
¿Cómo puedo hacer que mi función firebase se ejecute por completo?
CÓDIGO:
exports.fifteenMinutesData = functions .runWith(runtimeOpts) .pubsub .schedule('*/15 * * * *') .timeZone('Etc/UTC') .onRun((context) => { return (async() => { try { const Client = require('ftp'); const c = new Client(); c.connect({ host: "...", user: "..." }); c.on('ready', async function () { c.get('text.txt', async function (err, stream) { if (err) throw err; var content = ''; stream.on('data', function (chunk) { content += chunk.toString(); }); stream.on('end', function () { (async () => { try { let data = content; //etc.... } catch(err) { console.log("ERR: "+err); } })() }) }) }) } catch(err) { console.log("ERR: "+err) } })() });Deberá prometer el resultado para que el módulo sepa que el valor es asíncrono. Actualmente, su devolución de llamada no informa al módulo de nada, por lo que la ejecución finaliza de inmediato, querrá un formato como
exports.fifteenMinutesData = functions .runWith(runtimeOpts) .pubsub .schedule('*/15 * * * *') .timeZone('Etc/UTC') .onRun((context) => new Promise((resolve, reject) => { }); Donde llamas a resolve(data); para el camino del éxito y reject(err); para todas las rutas de ejecución de errores.