3 Task Scheduling Packages for Node.js
Tags: node, javascript, webdev, scheduling
Published: 2021-05-28 14:15:53

:hourglass_flowing_sand: 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](https://www.npmjs.com/package/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
```

### Examples
```
var cron = require('node-cron');

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

## [Node Schedule](https://www.npmjs.com/package/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
```

### Examples
```
const schedule = require('node-schedule');

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

## [Agenda](https://www.npmjs.com/package/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
```
You will also need a working [Mongo](https://www.mongodb.com/) database (v3) to point it to.

#### CJS / Module Imports
For regular javascript code, just use the default entrypoint
```js
const Agenda = require('agenda');
```

For Typescript, Webpack or other module imports, use `agenda/es` entrypoint:
```ts
import { Agenda } from 'agenda/es';
```
**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
```js
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");
})();
```

```js
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",
  });
})();
```

```js
(async function () {
  const weeklyReport = agenda.create("send email report", {
    to: "example@example.com",
  });
  await agenda.start();
  await weeklyReport.repeatEvery("1 week").save();
})();
```

:wave: 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 :smiley:

📱 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