Using Heroku Scheduler with Node.js

I am confused that nobody tried:

$ heroku run node yourScript.js

So put this in Heroku Scheduler

node yourScript.js

Worked for me.

PS: be sure to import everything your script needs.


Christophe's answer worked for me until I needed to pass a parameter to the script, at which point it failed. The issue is that node should not be specified in the task. Here is how exactly to get it working:

  1. In your Procfile, define a process type for your script. See below for a typical Procfile with a web process and, for running "scheduled_job.js", a second process type imaginatively named "worker".

    web: node app.js
    worker: node scheduled_job.js
    
  2. In the Heroku scheduler's Task column, just enter the name of the process type ("worker" in this example) with or without parameters. Don't enter 'node' before it. Heroku shows a dollar sign in front of it, so examples of a valid setup would be $ worker (run without arguments) or $ worker 123 abc (to execute scheduled_job.js with arguments "123" and "abc")


Create the file <project_root>/bin/say_hello:

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

Deploy to Heroku and test it with $ heroku run say_hello then add it to the scheduler with task name say_hello.

Explanation

Take say_hello.js as an example of a Node.js script that you would normally run using $ node say_hello.js.

Turn it into a script by

  1. removing the .js ending
  2. inserting the 'shebang' at the top: #! /app/bin/node [1][2]
  3. moving it into the bin directory [3]

[1] Read about the shebang on Wikipedia.
[2] The node executable is installed in app/bin/node on Heroku. You can check it out by logging into bash on Heroku with $ heroku run bash then asking $ which node.
[3] Heroku requires scripts to be placed in the bin directory. See Defining Tasks in the Heroku Dev Center.

I agree that the Heroku documentation for scheduling tasks is not very clear for anything other than Ruby scripts. I managed to work it out after some trial and error. I hope this helps.


A better approach is to define your schedule file called for example worker.js with following content:

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

and then in the heroku schedule, you just write node worker like you define it in the Procfile and that's all!