DEV Community

Richard Wynn
Richard Wynn

Posted on

14

3 Task Scheduling Packages for Node.js

⏳ Task scheduling allows you to schedule your code to be executed at a scheduled date/ time, at recurring intervals, or once after a specified interval. In Linux, this is often handled by packages like cron. In this article, I will show you top 4 task scheduling packages that emulate cron-like functionality for Node.js apps.

Node Cron

The node-cron module is tiny task scheduler in pure JavaScript for node.js based on GNU crontab. This module allows you to schedule task in node.js using full crontab syntax.

Popularity

  • 1.449.775 Weekly Downloads (Up to the time of this article)

Installation

You can install node-cron by using npm.

$ npm install --save node-cron
Enter fullscreen mode Exit fullscreen mode

Examples

var cron = require('node-cron');

cron.schedule('* * * * *', () => {
  console.log('running a task every minute');
});
Enter fullscreen mode Exit fullscreen mode

Node Schedule

Node Schedule is a flexible cron-like and not-cron-like job scheduler for Node.js. It allows you to schedule jobs (arbitrary functions) for execution at specific dates, with optional recurrence rules. It only uses a single timer at any given time (rather than reevaluating upcoming jobs every second/ minute).

Popularity

  • 1.941.398 Weekly Downloads (Up to the time of this article)

Installation

You can install node-schedule by using npm.

$ npm install node-schedule
Enter fullscreen mode Exit fullscreen mode

Examples

const schedule = require('node-schedule');

const job = schedule.scheduleJob('42 * * * *', function(){
  console.log('The answer to life, the universe, and everything!');
});
Enter fullscreen mode Exit fullscreen mode

Agenda

Agenda is a light-weight job scheduling library for Node.js that offers:

  • Minimal overhead. Agenda aims to keep its code base small.
  • Mongo backed persistence layer.
  • Promises based API.
  • Scheduling with configurable priority, concurrency, and repeating.
  • Scheduling via cron or human readable syntax.
  • Event backed job queue that you can hook into.

Popularity

  • 55.774 Weekly Downloads (Up to the time of this article)

Installation

npm

You can install agenda by using npm.

$ npm install agenda
Enter fullscreen mode Exit fullscreen mode

You will also need a working Mongo database (v3) to point it to.

CJS / Module Imports

For regular javascript code, just use the default entrypoint

const Agenda = require('agenda');
Enter fullscreen mode Exit fullscreen mode

For Typescript, Webpack or other module imports, use agenda/es entrypoint:

import { Agenda } from 'agenda/es';
Enter fullscreen mode Exit fullscreen mode

NOTE:

  • If you're migrating from @types/agenda you also should change imports to agenda/es.
  • Instead of import Agenda from 'agenda' use import Agenda from 'agenda/es'.

Examples

const mongoConnectionString = "mongodb://127.0.0.1/agenda";

const agenda = new Agenda({ db: { address: mongoConnectionString } });

// Or override the default collection name:
// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName'}});

// or pass additional connection options:
// const agenda = new Agenda({db: {address: mongoConnectionString, collection: 'jobCollectionName', options: {ssl: true}}});

// or pass in an existing mongodb-native MongoClient instance
// const agenda = new Agenda({mongo: myMongoClient});

agenda.define("delete old users", async (job) => {
  await User.remove({ lastLogIn: { $lt: twoDaysAgo } });
});

(async function () {
  // IIFE to give access to async/await
  await agenda.start();

  await agenda.every("3 minutes", "delete old users");

  // Alternatively, you could also do:
  await agenda.every("*/3 * * * *", "delete old users");
})();
Enter fullscreen mode Exit fullscreen mode
agenda.define(
  "send email report",
  { priority: "high", concurrency: 10 },
  async (job) => {
    const { to } = job.attrs.data;
    await emailClient.send({
      to,
      from: "example@example.com",
      subject: "Email Report",
      body: "...",
    });
  }
);

(async function () {
  await agenda.start();
  await agenda.schedule("in 20 minutes", "send email report", {
    to: "admin@example.com",
  });
})();
Enter fullscreen mode Exit fullscreen mode
(async function () {
  const weeklyReport = agenda.create("send email report", {
    to: "example@example.com",
  });
  await agenda.start();
  await weeklyReport.repeatEvery("1 week").save();
})();
Enter fullscreen mode Exit fullscreen mode

👋 And you? Have you ever used any of these packages or another packages to do cron stuff in Node.js? Feel free to put a comment below 😃

📱 Keep in Touch
If you like this article, don't forget to follow and stay in touch with my latest ones in the future by following me via:

Twitter: https://twitter.com/RichardWynn01
Medium: https://richard-wynn.medium.com
Github: https://github.com/richard-wynn

Billboard image

The fastest way to detect downtimes

Join Vercel, CrowdStrike, and thousands of other teams that trust Checkly to streamline monitoring.

Get started now

Top comments (0)

Cloudinary image

Zoom pan, gen fill, restore, overlay, upscale, crop, resize...

Chain advanced transformations through a set of image and video APIs while optimizing assets by 90%.

Explore

👋 Kindness is contagious

Dive into an ocean of knowledge with this thought-provoking post, revered deeply within the supportive DEV Community. Developers of all levels are welcome to join and enhance our collective intelligence.

Saying a simple "thank you" can brighten someone's day. Share your gratitude in the comments below!

On DEV, sharing ideas eases our path and fortifies our community connections. Found this helpful? Sending a quick thanks to the author can be profoundly valued.

Okay