Thứ tư, 23/09/2020 | 00:00 GMT+7

Cách sử dụng node-cron để chạy công việc đã lên lịch trong Node.js

cron cung cấp một cách để lặp lại một nhiệm vụ tại một khoảng thời gian cụ thể. Có thể có các việc lặp đi lặp lại như ghi log và thực hiện backup cần diễn ra hàng ngày hoặc hàng tuần.

Một phương pháp để triển khai cron trên server Node.js là sử dụng module node-cron . Thư viện này sử dụng cú pháp crontab , có thể quen thuộc với user có kinh nghiệm sử dụng cron trong hệ điều hành giống Unix trước đây.

Ảnh chụp màn hình của một tác vụ chạy lặp lại mỗi phút

Trong bài viết này, bạn sẽ xây dựng một ứng dụng nhỏ xóa định kỳ các file log khỏi server . Bạn cũng sẽ được trình bày với hai trường hợp sử dụng khác - backup database và gửi email theo lịch trình.

Yêu cầu

Để làm theo hướng dẫn này, bạn cần :

Hướng dẫn này đã được xác minh với Node v14.2.0, npm v6.14.5, express v4.17.1, và node-cron v2.0.3.

Bước 1 - Tạo ứng dụng nút và cài đặt phụ thuộc

Để bắt đầu, hãy tạo một ứng dụng Node mới bằng cách mở terminal của bạn và tạo một folder mới cho dự án của bạn:

  • mkdir cron-jobs-node

Tiếp theo, thay đổi vào folder dự án mới:

  • cd cron-jobs-node

Sau đó, khởi tạo nó, tạo file package.json mà bạn sẽ sử dụng để theo dõi các phụ thuộc:

  • npm init -y

Thêm khung web express và module node-cron bằng cách chạy lệnh sau:

  • npm install express@4.17.1 node-cron@2.0.3

Mô-đun express năng lượng cho web server mà bạn sẽ xây dựng. Mô node-cron đun node-cron là bộ lập lịch tác vụ.

Các phụ thuộc dự án được cài đặt. Hãy xây dựng server .

Bước 2 - Xây dựng server backend và lên lịch tác vụ

Bây giờ, bạn có thể xây dựng server và sử dụng node-cron để lên lịch cho một tác vụ chạy mỗi phút.

Tạo index.js :

  • nano index.js

Sau đó, yêu cầu node-cronexpress :

index.js
const cron = require('node-cron'); const express = require('express'); 

Và tạo một version của Express:

index.js
// ...  app = express();  app.listen(3000); 

Tiếp theo, thêm các dòng mã sau vào index.js của bạn giữa khai báo appapp.listen :

index.js
// ...  app = express();  // Schedule tasks to be run on the server. cron.schedule('* * * * *', function() {   console.log('running a task every minute'); });  app.listen(3000); 

Các dấu hoa thị này là một phần của cú pháp crontab để biểu thị các đơn vị thời gian khác nhau:

  * * * * * *   | | | | | |   | | | | | day of week   | | | | month   | | | day of month   | | hour   | minute   second ( optional ) 

Một dấu hoa thị hoạt động giống như một ký tự đại diện. Nghĩa là nhiệm vụ nên được chạy cho mọi trường hợp của đơn vị thời gian đó. Năm dấu hoa thị ( '* * * * *' ) thể hiện mặc định của crontab là chạy mỗi phút.

Các số ở vị trí của dấu hoa thị sẽ được coi là giá trị cho đơn vị thời gian đó. Cho phép bạn lên lịch các nhiệm vụ diễn ra hàng ngày và hàng tuần hoặc phức tạp hơn

Tìm hiểu thêm về cách ký hiệu này hoạt động trong Cách sử dụng Cron để Tự động hóa Công việc trên VPS .

Bây giờ, hãy chạy server :

  • node index.js

Bạn sẽ nhận được kết quả sau:

Output
running a task every minute running a task every minute running a task every minute ...

Bạn có một nhiệm vụ mẫu đang chạy mỗi phút. Bạn có thể dừng server bằng CTRL+C

Bây giờ, hãy xem cách chạy các việc chi tiết hơn.

Bước 3 - Xóa log lỗi

Hãy xem xét một tình huống mà bạn cần phải xóa file log thường xuyên khỏi server vào ngày 21 hàng tháng. Bạn có thể thực hiện điều này với node-cron .

Tạo một file log mẫu có tên là error.log :

  • nano error.log

Sau đó, thêm một tin nhắn kiểm tra:

This is an example error message that should be removed on the twenty-first day of the month. 

Tiếp theo, truy cập lại index.js :

  • nano index.js

Tác vụ này sẽ sử dụng fs để unlink một file . Thêm nó vào đầu file :

index.js
const cron = require('node-cron'); const express = require('express'); const fs = require('fs'); 

Sau đó, comment hoặc xóa tác vụ mẫu trước đó của bạn:

index.js
// ...  // Schedule tasks to be run on the server. // cron.schedule('* * * * *', function() {   // console.log('running a task every minute'); // });  app.listen(3000); 

Tiếp theo, thêm các dòng mã sau:

index.js
// ...  // Remove the error.log file every twenty-first day of the month. cron.schedule('0 0 21 * *', function() {   console.log('---------------------');   console.log('Running Cron Job');   fs.unlink('./error.log', err => {     if (err) throw err;     console.log('Error file successfully deleted');   }); });  app.listen(3000); 

Lưu ý mẫu: 0 0 21 * * .

  • Nó xác định một giá trị cho phút và giờ là 00 (“00:00” - đầu ngày).
  • Nó xác định một giá trị cho ngày là 21 .
  • Nó không xác định một tháng hoặc một ngày trong tuần.

Bây giờ, hãy chạy server :

  • node index.js

Vào ngày 21 của tháng, bạn sẽ nhận được kết quả sau:

Output
--------------------- Running Cron Job Error file successfully deleted

Bạn có thể không muốn đợi đến ngày 21 của tháng để xác minh nhiệm vụ đã được thực thi. Bạn có thể sửa đổi bộ lập lịch để chạy trong repository ảng thời gian ngắn hơn.

Kiểm tra folder server của bạn. Các error.log file cần xóa.

Bạn có thể chạy bất kỳ hành động nào bên trong bộ lập lịch. Các hành động khác nhau, từ tạo file đến gửi email và chạy tập lệnh. Ta hãy xem xét thêm các trường hợp sử dụng.

Bước 4 - Khám phá bằng cách sử dụng node-cron để backup database

Đảm bảo bảo toàn dữ liệu user là rất quan trọng đối với bất kỳ doanh nghiệp nào. Nếu một sự kiện không lường trước xảy ra và database của bạn bị hỏng hoặc bị hỏng, bạn cần khôi phục database của bạn từ bản backup . Bạn sẽ gặp rắc rối nghiêm trọng nếu bạn không có bất kỳ hình thức dự phòng hiện có nào cho doanh nghiệp của bạn .

Hãy xem xét một tình huống mà bạn cần thường xuyên backup kết xuất database vào lúc 11:59 tối mỗi ngày. Bạn có thể thực hiện điều này với node-cron .

Lưu ý : Trường hợp sử dụng này yêu cầu cài đặt database local . Vì điều này nằm ngoài phạm vi của bài viết này nên các chi tiết tốt hơn về quá trình cài đặt và cài đặt sẽ không được thảo luận.

Giả sử rằng bạn đã cài đặt và chạy SQLite trên môi trường của bạn . Lệnh shell của bạn để tạo bản backup database có thể giống như sau:

  • sqlite3 database.sqlite .dump > data_dump.sql

Lệnh này lấy database , database.sqlite và chạy lệnh .dump và xuất ra kết quả dưới dạng file có tên data_dump.sql

Tiếp theo, cài đặt shelljs , một module Node sẽ cho phép bạn chạy lệnh shell trước đó:

  • npm install shelljs@0.8.4

Tiếp theo, truy cập lại index.js :

  • nano index.js

Sau đó, yêu cầu shelljs :

index.js
const cron = require('node-cron'); const express = require('express'); const fs = require('fs'); // previous example const shell = require('shelljs'); 

Tiếp theo, thêm các dòng mã sau:

index.js
// ...  // Backup a database at 11:59 PM every day. cron.schedule('59 23 * * *', function() {   console.log('---------------------');   console.log('Running Cron Job');   if (shell.exec('sqlite3 database.sqlite .dump > data_dump.sql').code !== 0) {     shell.exit(1);   }   else {     shell.echo('Database backup complete');   } });  app.listen(3000); 

Lưu ý mẫu: 59 23 * * * .

  • Nó xác định một giá trị cho phút là 59 .
  • Nó xác định một giá trị cho giờ là 23 (hoặc 11 PM trong đồng hồ 24 giờ).
  • Nó không xác định một ngày, một tháng hoặc một ngày trong tuần.

Đoạn mã này sẽ chạy lệnh shell dự phòng. Nếu có lỗi, nó sẽ thoát ra. Nếu thành công, nó sẽ gửi lại một thông báo.

Bây giờ, hãy chạy server :

  • node index.js

Vào lúc 11:59 PM, bạn sẽ nhận được kết quả sau:

Output
--------------------- Running Cron Job Database backup complete

Có thể bạn không muốn đợi đến 11:59 PM để xác minh tác vụ đã được thực thi. Bạn có thể sửa đổi bộ lập lịch để chạy trong repository ảng thời gian ngắn hơn.

Kiểm tra folder server của bạn. data_dump.sql file data_dump.sql .

Tiếp theo, hãy xem xét việc gửi email định kỳ.

Bước 5 - Khám phá Sử dụng node-cron để gửi các email đã lên lịch

Hãy xem xét một tình huống mà bạn sắp xếp một danh sách các liên kết thú vị và sau đó gửi chúng qua email cho người đăng ký vào mỗi Thứ Tư. Bạn có thể thực hiện điều này với node-cron .

Bạn cần một account email từ một trong các dịch vụ SMTP được hỗ trợ .

Cảnh báo : Ta khuyên bạn nên tránh sử dụng account email cá nhân của bạn cho bước này. Các giải pháp nhanh trên internet có thể hướng dẫn bạn giảm các biện pháp bảo mật . Cân nhắc sử dụng account nhà phát triển riêng biệt mới để tránh mọi rủi ro cho account email cá nhân của bạn.

Tiếp theo, cài đặt nodemailer , một module Node sẽ cho phép bạn gửi email:

  • npm install nodemailer@6.4.11

Tiếp theo, truy cập lại index.js :

nano index.js 

Sau đó, yêu cầu trình nodemailer :

index.js
const cron = require('node-cron'); const express = require('express'); const fs = require('fs'); // previous example const shell = require('shelljs'); // previous example const nodemailer = require('nodemailer'); 

Thêm phần xác định phong bì và đặt tên user và password cho account email:

index.js
// ...  // Create mail transporter. let transporter = nodemailer.createTransport({   host: 'your_demo_email_smtp_host.example.com',   port: your_demo_email_port,   secure: true,   auth: {     user: 'your_demo_email_address@example.com',     pass: 'your_demo_email_password'<^>   } });  app.listen(3000); 

Cảnh báo : Bước này chỉ được trình bày cho mục đích ví dụ. Trong môi trường production , bạn sẽ sử dụng các biến môi trường để giữ bí mật cho password của bạn . Không lưu password (thông tin xác thực) của bạn trong bất kỳ mã nào bạn đang tải lên repository mã như GitHub.

Tiếp theo, thêm các dòng mã sau:

index.js
// ...  // Sending emails every Wednesday. cron.schedule('0 0 * * 3', function() {   console.log('---------------------');   console.log('Running Cron Job');    let messageOptions = {     from: 'your_demo_email_address@example.com',     to: 'user@example.com',     subject: 'Scheduled Email',     text: 'Hi there. This email was automatically sent by us.'   };    transporter.sendMail(messageOptions, function(error, info) {     if (error) {       throw error;     } else {       console.log('Email successfully sent!');     }   }); });  app.listen(3000); 

Lưu ý mẫu: 0 0 * * 3 .

  • Nó xác định một giá trị cho phút và giờ là 00 (“00:00” - đầu ngày).
  • Nó không xác định một ngày trong tháng hoặc một tháng.
  • Nó xác định một giá trị cho ngày trong tuần là '3' (Thứ Tư).

Mã này sẽ sử dụng thông tin đăng nhập được cung cấp để gửi email từ your_demo_email_address@example.com đến user@example.com . Với dòng tiêu đề: 'Scheduled Email' và nội dung: 'Hi there. This email was automatically sent by us.' . Hoặc ghi lại một lỗi nếu nó không thành công.

Bây giờ, hãy chạy server :

  • node index.js

Vào thứ Tư, bạn sẽ nhận được kết quả sau:

Output
--------------------- Running Cron Job Email successfully sent!

Bạn có thể không muốn đợi đến thứ Tư để xác minh nhiệm vụ đã được thực hiện. Bạn có thể sửa đổi bộ lập lịch để chạy trong repository ảng thời gian ngắn hơn.

Kiểm tra email của người nhận. Phải có một 'Scheduled Email' trong hộp thư đến.

Kết luận

Trong bài viết này, bạn đã học cách sử dụng node-cron để lập lịch công việc trên server Node.js.

Bạn đã được giới thiệu khái niệm rộng hơn về việc tự động hóa các nhiệm vụ lặp đi lặp lại một cách nhất quán và có thể dự đoán được. Khái niệm này có thể được áp dụng cho các dự án hiện tại và tương lai của bạn.

Có sẵn các công cụ lập lịch tác vụ khác. Đảm bảo đánh giá chúng để xác định công cụ nào phù hợp nhất cho dự án cụ thể của bạn.

Nếu bạn muốn tìm hiểu thêm về Node.js, hãy xem trang chủ đề Node.js của ta để biết các bài tập và dự án lập trình.


Tags:

Các tin liên quan