How to set up nodejs cron jobs

Nodejs cron jobs hay còn gọi là node schedule. Có nghĩa là trong hệ thống server sẽ cài đặt một lịch chạy tự động để giải quyết một công việc nào đó như send email sử dụng cron jobs. Những bạn nào làm backend thì chắc chắn sẽ không xa lạ gì với công việc này. Và bài viết này tôi sẽ giải thích kỹ hơn và sâu hơn nữa thì job scheduler bản chất nó là gì? 

Đầu tiên tôi sẽ show build một cron jobs mà không dung bất cứ một api hay thư viện nào hết, mục đích cho các bạn hình dung bản chất nó là gì? 

Build a Cron-Job using setTimeout javascript 

setTimeout là hầu như không thể không biết, setTimeout support nodejs và browser đầy đủ. Giờ ta lướt qua cú pháp nó thế nào? 

Cú pháp setTimeout

setTimeout(fn, ms)

ms là milisecons, 1000 ms = 1 second. Sử dụng setTimeout

 
setTimeout(()=>console.log("Hello Anonystick !!"), 1000)

Run function này thì sau 1 second thì sẽ print ra string: Hello Anonystick !! 

Ok! Bây giờ chúng ta sẽ tự tạo một fucntion tự động print ra Hello Anonystick mỗi một giây. Sử dụng setTimeout API. 

File app.js

function cron(ms, fn) {
    function cb() {
        clearTimeout(timeout)
        timeout = setTimeout(cb, ms)
        fn()
    }
    let timeout = setTimeout(cb, ms)
}

cron(1000, () => {
console.log('Hello Anonystick')
})

Các bạn có thể node app.js Và xem kết quả. 

How to set up nodejs cron jobs

Với câu lênh trên thì khi gọi function cron thì sẽ thiết lập một setTimeout luôn luôn chạy và không dừng. Cho đến khi ta tắt Terminal or Ctrl + C thì sẽ hết thực thi. Tất nhiên chúng ta sẽ có cách mà không cần đến Ctrl + C. 

Nhưng làm gì cho mệt trong khi có một middleware trong nodejs sẽ giúp chúng ta thực hiện một cách dễ dàng trong khi ta vẫn ngủ =]]

 Set up a cron jobs nodejs 

Create file app.js

const express = require('express');

// Define port for app to listen on
const port =  process.env.PORT || 8080;

/* ==================================================== */
/* ===== Section 2: Configure express middlewares ===== */
/* ==================================================== */

const app =  express();

/* ==================================== */
/* ===== Section 3: Making Routes ===== */
/* ==================================== */

// set routes

app.get('/', (req, res) => {
    res.render('index.html');
});

// To make the server live
app.listen(port, () => {
    console.log(`App is live on port ${port}`);
});

Giờ chúng ta thử chạy function cron middleware express mà chúng ta đã viết ở trên

const express = require('express');

// Define port for app to listen on
const port =  process.env.PORT || 8080;

/* ==================================================== */
/* ===== Section 2: Configure express middlewares ===== */
/* ==================================================== */
function cron(ms, fn) {
    function cb() {
        clearTimeout(timeout)
        timeout = setTimeout(cb, ms)
        fn()
    }
    let timeout = setTimeout(cb, ms)
    return {};
}

cron(1000, () => {
console.log('Hello Anonystick in middleware ')
})

const app =  express();

/* ==================================== */
/* ===== Section 3: Making Routes ===== */
/* ==================================== */

// set routes

app.get('/', (req, res) => {
    res.render('index.html');
});

// To make the server live
app.listen(port, () => {
    console.log(`App is live on port ${port}`);
});

Kết quả chúng ta sẽ thấy hình dưới.

How to set up nodejs cron jobs

Bây giờ chúng ta sẽ install một middleware giúp chúng ta thực hiện cron jobs một cách hiệu quả đó là node-cron 

Using node-cron create job scheduler in nodejs

$ npm i node-cron --save 

Lúc đó file app.js sẽ thay đổi như thế này.

const express = require('express');
const cron = require('node-cron')
// Define port for app to listen on
const port =  process.env.PORT || 8080;

/* ==================================================== */
/* ===== Section 2: Configure express middlewares ===== */
/* ==================================================== */

//set up cronjobs 
cron.schedule('* * * * *', () => {
    console.log('Nếu không set gì hết thì mặc định sẽ chạy mỗi phút 1 lần');
});

const app =  express();

/* ==================================== */
/* ===== Section 3: Making Routes ===== */
/* ==================================== */

// set routes

app.get('/', (req, res) => {
    res.render('index.html');
});

// To make the server live
app.listen(port, () => {
    console.log(`App is live on port ${port}`);
});

Thường thì chúng ta sẽ chú ý những tham số "*****". Giải thích Sau khi xem qua hình ảnh thì chúng ta có thể đoán được rằng

//set up cronjobs 
cron.schedule('* * * * *', () => {
    console.log('Nếu không set gì hết thì mặc định sẽ chạy mỗi phút 1 lần');
});

cron.schedule('1,2,4,5 * * * *', () => {
    console.log('chạy vào phút thứ 1, 2, 4, và 5');
});

Để hiểu thêm hơn các bạn nên đọc thêm npm node-cron 

Vậy là xong, qua bài này tôi và các bạn đã hiểu rõ hơn bản chất của set up a cron jobs in nodejs thế nào rồi phải không? 

Cảm ơn các bạn đã đọc!