es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo ejecutar un trabajo cron cuando el código está en otro archivo – Node JS

Estoy tratando de ejecutar un cron cada hora.

Para ello, he iniciado el cron job en mi archivo ‘index.js’ de la siguiente manera

const cron = require('node-cron');
const readDocuments = require("./cronJobs/readDocuments");
var task = cron.schedule('0 0 */1 * * *', readDocuments);

task.start();

Mientras tanto, el código real que debe ser ejecutado ha sido escrito en ‘./cronJobs/readDocuments’ y el código dentro de este archivo es el siguiente, donde intento leer un archivo CSV.

const ResponseManager = require("../common/ResponseManager");

var fs = require('fs');
const csv = require('csv-parser');

console.log('Leyendo Documento....')
try {
  var filepath = "../files/abc.csv";
  fs.createReadStream(filepath)
  .on('error', () => {
    // manejar el error
  })
  .pipe(csv())
  .on('data', (row) => {
    console.log('fila', row)
  })
  .on('end', () => {
    // manejar el final del CSV
  })
} catch (error) {
  console.log('error', error)
  res.status(500).json(ResponseManager(false, error.message));
}

Cuando ejecuto el archivo de Node.js en la línea de comandos con ‘node index.js’, se muestra en la consola “Leyendo Documento….”, pero el resto del código no se ejecuta. Me está dando el error “throw ‘execution must be a function'”.
¿Cómo puedo resolver esto o cuál es el procedimiento real para ejecutar el código de un archivo con un cron job desde index.js?

Por favor, ayuda. ¡Gracias!

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema aquí está en la forma en que se llama a la función readDocuments dentro del método cron.schedule. En lugar de pasar la función como parámetro, debes pasarla como una función de retorno de llamada.

    Para hacer esto, puedes modificar el archivo index.js de la siguiente manera:

    const cron = require('node-cron');
    const readDocuments = require('./cronJobs/readDocuments');
    var task = cron.schedule('0 * * * *', () => {
        readDocuments();
    });
    
    task.start();
    

    Aquí estamos pasando una función de retorno de llamada que ejecuta la función readDocuments cada hora utilizando la sintaxis cron 0 * * * *. Ten en cuenta que también estamos eliminando la llamada a la función readDocuments() en el archivo readDocuments.js.

    Luego, en el archivo readDocuments.js, puedes definir la función readDocuments de la siguiente manera:

    const ResponseManager = require('../common/ResponseManager');
    const fs = require('fs');
    const csv = require('csv-parser');
    
    function readDocuments() {
        console.log('Leyendo Documento....');
        try {
            var filepath = "../files/abc.csv";
            fs.createReadStream(filepath)
            .on('error', () => {
                // manejar error
            })
            .pipe(csv())
            .on('data', (row) => {
                console.log('fila', row)
            })
            .on('end', () => {
                // manejar el final del CSV
            });
        } catch (error) {
            console.log('error', error)
            res.status(500).json(ResponseManager(false, error.message));
        }
    }
    
    module.exports = readDocuments;
    

    Aquí estamos definiendo la función readDocuments que lee el archivo CSV y registra las filas en la consola. Ten en cuenta que estamos exportando esta función utilizando module.exports, de modo que pueda ser importada en el archivo index.js.

    Con estas modificaciones, deberías poder ejecutar la función readDocuments utilizando cron cada hora.

Comments are closed.