Scheduling Cron Jobs in Node.js with Node-Cron
Tags: node, javascript
Published: 2022-02-01 14:03:51

---
title: Scheduling Cron Jobs in Node.js with Node-Cron
published: true
date: 2020-08-11 03:33:28 UTC
tags: node,javascript
canonical_url: https://sabinadams.hashnode.dev/scheduling-cron-jobs-in-nodejs-with-node-cron
cover_image: https://cdn.hashnode.com/res/hashnode/image/upload/v1597118125154/ZBM0GwAYl.png
---

We as developers often run across situations where we want some process to happen on a certain schedule. It could be clearing out error logs every Monday evening, emailing users who haven't checked in to an event the day before their event takes place, archiving old data, etc...

In situations like these, we look to cron jobs! In Node.js, setting up a Cron job is simple with the help of [`node-cron`](https://github.com/node-cron/node-cron). Let's take a look at what it can do.

* * *

## What We Are Going To Build

Perhaps you wish someone would complement you every day, praising your productivity and progress that day. With `node-cron` that is possible!

![backpat.gif](https://cdn.hashnode.com/res/hashnode/image/upload/v1597109009490/Vsm7UfVkD.gif)

In this tutorial, we will set up an [Express](https://expressjs.com/) server on Node.js to give an under-appreciated developer (or yourself...) some well deserved praise every day. This server will schedule a task to run every evening at 5:30pm congratulating its developer on a productive day at work. Let's get started!

_This tutorial assumes you have [Node.js](https://nodejs.org/en/) installed on your machine_

* * *

## Setting Things Up

The first step here will be to get a simple Express server up and running. We'll need a directory to hold the project:

```
mkdir <project-name> 
cd <project-name>

```

### Installing The Modules

Now we'll want to initialize NPM in this directory so we can get to installing the packages we need:

```
npm init

```

Our `package.json` file has been generated, now let's install those packages. We're going to need:

- [`express`](https://expressjs.com/) - Framework for our web-server 
- [`node-cron`](https://www.npmjs.com/package/node-cron) - Used to schedule our task
- [`nodemailer`](https://nodemailer.com/about/) - Used to send our emails

```
npm i --save express node-cron nodemailer

```

### Building out the basic server

The entry file to our server will be named `index.js`. Create it by running:

```
touch index.js

```

And we will start a simple express server with the following:

```
const express = require('express'),
      app = express(),
      nodemailer = require('nodemailer'),
      cron = require('node-cron'),
      PORT = 3001

app.listen(PORT, () =>  
    console.log(`Listening on ${PORT}`)
)

```

Here we are importing all the packages we will need at the top, instantiating an express app, and starting the server on port 3000.

Our express server is all set up! We can start our server by running this command:

```
node index.js

```

* * *

## Scheduling Our Task

With our server set, we are now ready to get to scheduling! `node-cron` has one main function called `schedule()` that is the starting point for every job. `schedule()` can take in three parameters:

1. `expression` - This is the cron expression that defines when the task should run. It follows the standard cron syntax, along with a few extra options specific to the library, defined [here](https://www.npmjs.com/package/node-cron#cron-syntax) 
2. `function` - This is the function that will be run on the specified time-interval
3. `options` - This is an object that takes in configuration options. These options are described [here](https://www.npmjs.com/package/node-cron#options). We will not be setting any extra options in this tutorial so I will be omitting this parameter.

Here's a simple example:

![carbon (3).png](https://cdn.hashnode.com/res/hashnode/image/upload/v1597113967677/ZOlwLqdwL.png)

Here, we are scheduling a task to run according to this expression: `* * * * *`, which evaluates to every minute. Every time this task is run, the message `running every minute` will be logged to the console.

Here are a few more examples of expressions:

- `* * * * Fri` runs every Friday
- `1 * * * *` runs every time the minute of a date is 1. (12:01, 3:01, 4:01)
- `45 7 * * *` runs every day at 7:45am (uses a 24-hour clock)

The expression we will be looking for in our scenario (5:30pm every day) will be: `30 17 * * *`

So let's schedule it!

```
const express = require('express'),
      app = express(),
      nodemailer = require('nodemailer'),
      cron = require('node-cron'),
      PORT = 3001

cron.schedule('30 17 * * *', () => 
    console.log('Running at 5:30pm every day')
)

app.listen(PORT, () =>  
    console.log(`Listening on ${PORT}`)
)

```

Awesome! We have an express server scheduling a task to run at 5:30pm every day. `node-cron` made it super simple to set that up. Now we can finish this project off and start sending ourselves the encouragement we need!

## Sending The Emails

I will be using a Gmail account to set up our send mail request. If you receive some sort of authentication error while trying to send emails, it may be because Gmail has blocked `Less Secure Apps`. You will need to switch this setting on to `Allow Less Secure Apps` [here](https://support.google.com/accounts/answer/6010255?p=lsa_blocked&hl=en&visit_id=637327124231562564-3553326590&rd=1)

**NOTE** : _It is recommended you switch this setting back off once you are done testing_

### Set up our transporter

We will first need to set up what is called a `transporter`. This holds info on your authentication details and email host.

```
const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'your-email@gmail.com',
        pass: 'password'
    }
})

```

**Note** : _In a real-world scenario the auth details should be stored as secrets or in some sort of environment variable to avoid storing credentials in the source-code._

This sets up a transport that is ready to start sending emails. Within our scheduled task, let's send an email

```
const express = require('express'),
      app = express(),
      nodemailer = require('nodemailer'),
      cron = require('node-cron'),
      PORT = 3001

const transporter = nodemailer.createTransport({
    service: 'gmail',
    auth: {
        user: 'your-email@gmail.com',
        pass: 'password'
    }
})

cron.schedule('30 17 * * *', async () => 
    transporter.sendMail({
        from: 'your-email@gmail.com',
        to: 'recipient@hey.com',
        subject: 'You are awesome',
        text: 'You did SUCH A GOOD JOB TODAY. CONGRATS!! 🎉🎉🎉'
    }, (error, info) => {
        if (error) {
            console.log(error);
        } else {
            console.log('Email sent: ' + info.response);
        }
    })
)

app.listen(PORT, () =>  
    console.log(`Listening on ${PORT}`)
)

```

And that'll do it! Every day at 5:30pm an email will get sent from `your-email@gmail.com` to `recipient@hey.com` with a subject of `You are awesome` and a very encouraging message 😁

* * *

## Conclusion

With our application complete, we can now send ourselves much-needed encouragement on a daily basis (or more frequently depending on how you configure the task and how needy you're feeling 😜).

`node-cron` makes it super easy to schedule a task on a desired time-interval. It also has a lot of other configurations that give it some pretty cool use-cases. I'd highly recommend reading through their docs to see what all it can do with its various configuration options.

Hope this has helped, thanks for the read!

_Calendar vector created by freepik - [www.freepik.com](https://www.freepik.com/vectors/calendar)_