Among other various packages in node.js for scheduling jobs, node-cron is one of the most widely used ones.
You can schedule things like creating backups, operations on filesystem like copying, deleting, etc. or sending E-mails and SMS on specific times with specific conditions.
The docs provide bare minimum usage of how it is supposed to be used.
In this blog, we will go through the usage of node-cron in production level environment with cleaner syntax and better readability.
For the sake of simplicity, we will be moving forward with a clean project.
Simply start the project with:
npm init
Now install the package:
npm i node-cron
You can use the boilerplate that I grabbed from MSDN docs for quickly setting up the environment.
Create index.js
and copy the code provided below:
//Load HTTP module
const http = require("http");
const hostname = "127.0.0.1";
const port = 5000;
//Create HTTP server and listen on port 3000 for requests
const server = http.createServer((req, res) => {
//Set the response HTTP header with HTTP status and Content type
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
res.end("Hello World\n");
});
//listen for request on port 3000, and as a callback function have the port listened on logged
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Now you have set up the web server running at http://127.0.0.1:5000
Now create a proper architecture to store the code so that it's in better readable format.
Create file index.js
in src/cron/
directory and paste the following code:
const cron = require("node-cron");
function cronJobs() {
console.log("Initiating Cron Jobs...");
}
module.exports = cronJobs;
Now call this function in your main index.js
file in root directory.
At the top:
const cronJobs = require("./src/cron");
In the main code before the server starts:
//Executing Cron Jobs
cronJobs();
Your main index.js
file should now look like this:
//Load HTTP module
const http = require("http");
const cronJobs = require("./src/cron");
const hostname = "127.0.0.1";
const port = 5000;
//Create HTTP server and listen on port 3000 for requests
const server = http.createServer((req, res) => {
//Set the response HTTP header with HTTP status and Content type
res.statusCode = 200;
res.setHeader("Content-Type", "text/plain");
res.end("Hello World\n");
});
//Executing Cron Jobs
cronJobs();
//listen for request on port 3000, and as a callback function have the port listened on logged
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});
Now when you run the server, you should see following debug log:
Initiating Cron Jobs...
Server running at http://127.0.0.1:5000/
Now you are all set to schedule the jobs..
Create a directory called jobs
in cron
like this:
src/cron/jobs/
Here you can store your functions for whatever purpose you are using this i.e., sending e-mails, creating backups, etc..
Create a new file index.js
in src/cron/
folder and paste the following code:
const creatingBackup = () => {
console.log("Backup ran at", Date.now());
};
module.exports = creatingBackup;
It's a simple debug log but you can apply your implementation in the function.
Similary, you can use another one in src/cron/jobs/sendEmail.js
as:
const sendEmail = () => {
console.log("Email sent at", Date.now());
};
module.exports = sendEmail;
Now make sure that both these functions are called src/cron/index.js
const cron = require("node-cron");
const creatingBackup = require("./jobs/creatingBackup");
const sendEmail = require("./jobs/sendEmail");
function cronJobs() {
console.log("Initiating Cron Jobs...");
cron.schedule("* * * * *", () => {
creatingBackup();
});
cron.schedule("*/10 * * * * *", () => {
sendEmail();
});
}
module.exports = cronJobs;
Note you can schedule tasks for any time of your choice, you just need to have a proper expression defined. These websites may help you in creating those:
You can find the code here at:
https://github.com/Shameel123/node-cron-production-way
Top comments (1)
The thing is, when I’m uploading my application with scheduled task(in my case I use “croner”) it works on localhost, but does not work at prod…