Let’s go through cron jobs and task scheduling in Node.js, which is essential for running periodic tasks, background jobs, or automation.
1️⃣ What Are Cron Jobs?
-
Cron jobs = scheduled tasks that run automatically at specific intervals.
-
Useful for tasks like:
-
Sending emails or notifications
-
Cleaning temporary files
-
Database maintenance or backups
-
Fetching API data periodically
-
2️⃣ Using node-cron
Install
npm install node-cron
Basic Usage
const cron = require("node-cron");
// Schedule a task to run every minute
cron.schedule("* * * * *", () => {
console.log("Task running every minute:", new Date().toISOString());
});
Cron Syntax
* * * * *
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └ day of week (0 - 7) (Sunday=0 or 7)
│ │ │ └───── month (1 - 12)
│ │ └────────── day of month (1 - 31)
│ └─────────────── hour (0 - 23)
└──────────────────── minute (0 - 59)
- Example:
0 9 * * *
→ every day at 9:00 AM
Example: Daily Task
cron.schedule("0 0 * * *", () => {
console.log("Running a daily task at midnight");
});
3️⃣ Using setInterval
for Simple Scheduling
- For simple repeating tasks, you can use Node’s built-in
setInterval
:
setInterval(() => {
console.log("Running task every 10 seconds");
}, 10000);
- Limitation: No cron-like scheduling, only interval-based
4️⃣ Advanced Task Scheduling: bull
+ Redis
- For robust background jobs with retry, queueing, and concurrency, use Bull:
npm install bull
Example: Queue Job
const Queue = require("bull");
const myQueue = new Queue("emailQueue", "redis://127.0.0.1:6379");
// Add a job
myQueue.add({ email: "user@example.com" }, { repeat: { cron: "0 9 * * *" } });
// Process jobs
myQueue.process(async (job) => {
console.log("Sending email to:", job.data.email);
});
-
Features:
-
Retry failed jobs
-
Concurrency control
-
Persistent queues
-
Delayed/repeating jobs
-
5️⃣ Best Practices
-
Use node-cron for simple periodic tasks
-
Use Bull / Bee-Queue for robust background processing
-
Avoid blocking the main thread in cron jobs → use async tasks or child processes
-
Log task execution for monitoring and debugging
-
Use environment-specific scheduling → avoid running heavy tasks in development
✅ Summary
Task Type | Tool / Method | Notes |
---|---|---|
Simple periodic tasks | node-cron | Cron-like scheduling |
Repeating intervals | setInterval | Lightweight, interval-based |
Background jobs / queues | bull + Redis | Robust, retries, concurrency |
Best practice | Async tasks, logging | Avoid blocking main thread |