web-dev-qa-db-fra.com

Utilisation de Heroku Scheduler avec Node.js

Il n'y a littéralement aucun tutoriel sur l'utilisation de Heroku Scheduler avec Node.js. Supposons que j'ai une fonction appelée dis bonjour() et je voudrais l'exécuter toutes les 10 minutes. Comment puis-je l'utiliser dans le contrôleur. En Ruby vous écrivez rake nom_fonction () cependant aucune explication n'a été faite pour Node. Puis-je écrire '/dis bonjour' ou devrais-je faire une configuration supplémentaire?

49
Ali

Créez le fichier <project_root>/bin/say_hello:

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

Déployez sur Heroku et testez-le avec $ heroku run say_hello puis ajoutez-le au planificateur avec le nom de la tâche say_hello.

Explication

Prenez say_hello.js comme exemple de script Node.js que vous exécuteriez normalement en utilisant $ node say_hello.js.

Transformez-le en script en

  1. suppression du .js fin
  2. insérer le "Shebang" en haut: #! /app/bin/node [1] [2]
  3. le déplacer dans le répertoire bin [3]

[1] Lisez à propos de Shebang sur Wikipedia .
[2] L'exécutable node est installé dans app/bin/node sur Heroku. Vous pouvez le vérifier en vous connectant à bash sur Heroku avec $ heroku run bash puis demander $ which node.
[3] Heroku nécessite que les scripts soient placés dans le répertoire bin. Voir Définir les tâches dans Heroku Dev Center.

Je suis d'accord que la documentation Heroku pour la planification des tâches n'est pas très claire pour autre chose que Ruby scripts. J'ai réussi à le résoudre après quelques essais et erreurs. J'espère que cela aide.

82
Philip Poots

Une meilleure approche consiste à définir votre fichier de planification appelé par exemple worker.js avec le contenu suivant:

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

puis dans le programme heroku, vous écrivez simplement node worker comme vous le définissez dans le Procfile et c'est tout!

39

La réponse de Christophe a fonctionné pour moi jusqu'à ce que je devais passer un paramètre au script, auquel cas il a échoué. Le problème est que node ne doit pas être spécifié dans la tâche. Voici comment exactement le faire fonctionner:

  1. Dans votre Procfile, définissez un type de processus pour votre script. Voir ci-dessous pour un Procfile typique avec un processus Web et, pour exécuter "sched_job.js", un deuxième type de processus nommé avec imagination "travailleur".

    web: node app.js
    worker: node scheduled_job.js
    
  2. Dans la colonne Tâche du planificateur Heroku, entrez simplement le nom du type de processus ("travailleur" dans cet exemple) avec ou sans paramètres. Ne saisissez pas 'node' avant. Heroku montre un signe dollar devant lui, donc des exemples d'une configuration valide seraient $ worker (exécuté sans arguments) ou $ worker 123 abc (pour exécuter schedule_job.js avec les arguments "123" et "abc")

23
Clafou

Je suis confus que personne n'ait essayé:

$ heroku run node yourScript.js

Alors mettez ça dans Heroku Scheduler

node yourScript.js

A travaillé pour moi.

PS: assurez-vous de import tout ce dont votre script a besoin.

3
Simon Franzen

Les étapes suivantes fonctionnent dans ma situation.

  1. Dans le dossier racine, ajoutez le fichier worker.js.
  2. Dans worker.js. Écrivez une fonction simple, comme ci-dessus. function sayHello() { console.log('Hello'); } sayHello();
  3. Accédez aux modules complémentaires de Heroku Scheduler. Cliquez sur 'ajouter un nouveau travail' et tapez 'travailleur' ​​dans le champ. Ensuite, définissez l'intervalle de temps et cliquez sur enregistrer.

Voici quelque chose que vous devriez remarquer

  1. Après la mise à jour fonctionne, si vous utilisez l'exemple ci-dessus, vous pouvez utiliser heroku run node worker.js Pour vérifier si cela fonctionne. Il devrait afficher "Bonjour" dans votre terminal.
  2. J'utilise express-babel starter pour mon projet node.js.
2
陳見綸