Usando Heroku Scheduler con Node.js


Literalmente no hay ningún tutorial sobre el uso de Heroku Scheduler con Node.js. Supongamos que tengo una función llamada sayHello () y me gustaría ejecutarla cada 10 minutos. Cómo puedo usarlo en el controlador. En ruby escribes rake function_name() sin embargo, no hay explicación para Node. ¿Puedo escribir '/sayHello' o debo hacer una configuración adicional?

Author: Ali, 2012-11-12

5 answers

Crea el archivo <project_root>/bin/say_hello:

#! /app/bin/node
function sayHello() {
  console.log('Hello');
}
sayHello();
process.exit();

Despliégalo a Heroku y pruébalo con $ heroku run say_hello luego agrégalo al planificador con el nombre de la tarea say_hello.

Explicación

Tome say_hello.js como ejemplo de un nodo.script js que normalmente se ejecutaría usando $ node say_hello.js.

Convertirlo en un guión por

  1. eliminando el .js que termina
  2. insertando el 'shebang' en la parte superior: #! /app/bin/node [1][2]
  3. moviéndolo al directorio bin [3]

[1] Leer más the shebang on Wikipedia.
[2] El ejecutable node está instalado en app/bin/node en Heroku. Puedes comprobarlo iniciando sesión en bash en Heroku con $ heroku run bash y luego preguntando $ which node.
[3] Heroku requiere que los scripts se coloquen en el directorio bin. Ver Definir tareas en el Centro de Desarrollo de Heroku.

Estoy de acuerdo en que la documentación de Heroku para la programación de tareas no es muy clara para nada más que scripts Ruby. Me las arreglé para resolverlo después de algún ensayo y error. Me espero que esto ayude.

 76
Author: Philip Poots,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-19 00:02:48

Un mejor enfoque es definir su archivo de programación llamado por ejemplo worker.js con el siguiente contenido:

function sayHello() {
    console.log('Hello');
}
sayHello();

Y luego en el horario de heroku, simplemente escribes node worker como lo defines en el Procfile y eso es todo!

 39
Author: Christophe Vidal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-04 21:09:23

La respuesta de Christophe funcionó para mí hasta que necesité pasar un parámetro al script, momento en el que falló. El problema es que node no debe especificarse en la tarea. Aquí es exactamente cómo hacer que funcione:

  1. En su Procfile, defina un tipo de proceso para su script. Vea a continuación un Procfile típico con un proceso web y, para ejecutar " scheduled_job.js", un segundo tipo de proceso llamado imaginativamente "worker".

    web: node app.js
    worker: node scheduled_job.js
    
  2. En el Heroku en la columna de tareas del planificador, simplemente ingrese el nombre del tipo de proceso ("worker" en este ejemplo) con o sin parámetros. No ingrese 'nodo' antes de él. Heroku muestra un signo de dólar delante de él, por lo que los ejemplos de una configuración válida serían $ worker (ejecutar sin argumentos) o $ worker 123 abc (ejecutar scheduled_job.js con argumentos " 123 " y "abc")

 22
Author: Clafou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-04 12:52:54

Estoy confundido que nadie lo intentó:

$ heroku run node yourScript.js

Así que pon esto en Heroku Scheduler

node yourScript.js

Funcionó para mí.

 2
Author: Simon Franzen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-28 01:28:59

Los siguientes pasos funcionan en mi situación.

  1. En la carpeta raíz agregue el archivo worker.js.
  2. En worker.js. Escribe una función simple, como la anterior. function sayHello() { console.log('Hello'); } sayHello();
  3. Vaya a heroku Scheduler add-ons. Haga clic en 'agregar nuevo trabajo' y escriba 'trabajador' en el campo. A continuación, establezca el intervalo de tiempo y haga clic en guardar.

Aquí hay algo que debe notar

  1. Después de la actualización funciona la configuración.Si usa el ejemplo anterior, puede usar heroku run node worker.js para verificar si funciona. Debe ser mostrar 'Hola' en su terminal.
  2. Utilizo express-babel starter para mi nodo.js project.
 1
Author: 陳見綸,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-13 08:05:34