There is literally no tutorial about using Heroku Scheduler with Node.js. Assume that I have a function called sayHello() and I would like to run it every 10 mins. How can I use it in controller. In ruby you write rake function_name() however no explanation made for Node. Can I write '/sayHello' or I should do extra configuration?
Create the file <project_root>/bin/say_hello
:
#! /app/bin/node
function sayHello() {
console.log('Hello');
}
sayHello();
exit();
Deploy to Heroku and test it with $ heroku run say_hello
then add it to the scheduler with task name say_hello
.
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
.js
ending#! /app/bin/node
[1][2] 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!
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:
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
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")