Viết API Covid 19 realtime bằng NodeJS – phần 1

8 min


1052
1.5k share, 1052 points

Tại sao lại chọn NodeJS ?

Như mọi người đã biết, virus covid tiếp tục ảnh hưởng cuộc sống của chúng ta theo nhiều hướng khác nhau. Tôi quyết định tạo một ứng dụng đơn giản để có thể hiển thị trường hợp covid bằng đồ thị.

Khi NodeJS lần đầu tiên xuất hiện, khía cạnh ấn tượng nhất là IIS. Đó là bạn có thể tạo ứng dụng phía máy chủ trong môi trường localhost mà không cần hosting. 

Api Covid chứa những gì?

Như tôi đã đề cập trong tiêu đề của bài viết, nó được viết bằng NodeJS, tức là javascript. Trong bài viết, sử dụng firebase để lưu cơ sở dữ liệu. Tôi đã chọn package node-schedule để lập lịch trình. 

Tôi cần phân tích cú pháp thông tin từ trang web của Bộ Y tế, vì vậy cần cài đặt package cheerio. Ngoài ra, swagger cũng không thể thiếu trong phần này

Hãy tạo dự án NodeJS

res.header(“Access-Control-Allow-Origin”, “*”);

Để có thể gọi api từ ứng dụng giao diện người dùng, chúng ta cần thêm nó. Bây giờ có ứng dụng không có bất kỳ route nào. Hãy cố gắng thực hiện route thích hợp ngay bây giờ. Nhưng trước khi tạo route này, sẽ hữu ích khi nói sơ qua về thiết kế của API.

API covid gồm 3 phần:

1-) Schedule(Lịch biểu): Một chức năng đã lên lịch sẽ truy cập vào firebase mỗi giờ để xem liệu có dữ liệu mới của ngày hôm nay hay không. Nếu có, thì sẽ xuất hiện mà không cần làm gì cả.

Ngược lại không có, thì dữ liệu sẽ được lấy từ Bộ Y tế và kiểm tra xem dữ liệu ngày hôm nay đã đến chưa.

Trong trường hợp có, sẽ được thêm vào db firebase.

2-) covid19: Bao gồm truy xuất dữ liệu hàng ngày. Endpoint là nhằm trực tiếp reponse dữ liệu trong ngày. Nó kiểm tra dữ liệu bằng cách get dữ liệu từ database. Trang web của Bộ y tế không được truy cập vào thời điểm bảo trì.

3-) allcovid19: Cung cấp tất cả dữ liệu ở phía Database của endpoint. Tại thời điểm bảo trì, trang web của bộ y tế không gọi được.

Sau khi đề cập ngắn gọn về thiết kế API, bây giờ đến với phía cơ sở dữ liệu. Tôi đã đề cập trước đó rằng sử dụng firebase. Có nhiều tài nguyên có sẵn, bao gồm cả Medium, để sử dụng NodeJS và firebase. 

Tham khảo thêm về Firebase tại: Từng bước tạo ứng dụng React với Firebase

Trong khi thực hiện các cài đặt trên, firebase tạo tệp cấu hình bằng ngôn ngữ mong muốn.

Cuối cùng, tôi đã đặt tên như sau:  api -> collection. Trong firebase hiển thị như sau: 

Viết API Covid bằng NodeJS
Database covid 19

Một trong những lý do tôi sử dụng Firebase là dữ liệu được giữ dưới dạng json thay vì cấu trúc bảng-cột tương đối trong RDMS. Việc phát triển ứng dụng rất dễ dàng. Tất nhiên là có nhiều tùy chọn khác như mongo db.

Schedule (Lịch biểu)

Như đã nói trên, chúng ta sử dụng node-schedule và cài đặt bằng câu lệnh sau

npm install node-schedule

Để sử dụng nó trong project, thêm nó vào tệp App.js như sau

const schedule = require(“node-schedule”); // For scheduler schedule.scheduleJob(“*/59 * * * *”, function () { utility.saveDataToDb(); });

Tôi đã làm cho hàm saveDataToDb () chạy 59 phút một lần để cập nhật dữ liệu covid.

 Tệp App.js như sau :

Viết API Covid bằng NodeJS
API Covid 19

Trong tệp utility, chúng ta import các mô-đun như bên dưới và cung cấp tệp có liên quan cho firebase và làm cho nó sẵn sàng hoạt động.

Viết API Covid bằng NodeJS

File json “serviceAccount” mà chúng ta thấy ở trên là một tệp hữu ích chứa các giá trị chính được tạo từ bảng điều khiển firebase.

Nó được định nghĩa ở trên là Object được xuất ra và sử dụng trong tệp App.js. Bây giờ, hãy cung cấp các hàm của chúng ta dưới dạng khóa-giá trị tùy theo nhu cầu.

Viết API Covid bằng NodeJS

Trước tiên, chức năng saveDataToDb sẽ lấy dữ liệu từ db , sau đó kiểm tra dữ liệu từ bộ y tế. Nếu không có dữ liệu trong ngày trong db và thêm dữ liệu mới nếu có. Điều đầu tiên cần làm trong phạm vi này là viết hàm trích xuất dữ liệu trong ngày từ db,

Lý do hàm không đồng bộ(tính năng của NodeJS) vì sử dụng nó sau này từ một endpoint khác. Khi chúng ta xem xét hàm, cố gắng trích xuất dữ liệu bằng cách sử dụng phương thức GET của tài liệu ở định dạng “ddmmyyyy” trong collection  “covid19” của firebase. “FormattedDateOfToday” được sử dụng ở đây trả về ngày hiện tại là dd.mm.yyyy. Từ định dạng “.” chúng ta có thể kiểm tra bằng cách xóa “.”

Tại sao lại theo cách này?

Như tôi đã đề cập trong thiết kế api, chúng ta xóa các “.” trong ngày tháng, định dạng của vùng xác định cho api và giữ chúng dưới dạng id. Bằng cách này, tôi dự định sử dụng để xếp hạng sau này.

Viết API Covid bằng NodeJS

Bây giờ chúng ta có thể đến với hàm saveDataToDb.

Viết API Covid bằng NodeJS

Lấy dữ liệu từ db và kiểm tra xem có phải dữ liệu của ngày hôm nay hay không. Sau đó, gửi requestPromise NodeJS đến trang covid19.saglik.gov.tr.

“WebAdressConstants.TurkeyHealthMinistery” là tham chiếu từ tệp js khác và code đọc được bằng cách thực hiện điều này qua hằng số. Thay vì sử dụng trực tiếp chuỗi mã cứng. Sau đó thay đổi hiệu ứng từ một điểm duy nhất nếu cần. Bạn có thể tạo tệp js khác và thay đổi nội dung như sau vào App.js bằng cách import.

Image for post

requestPromise in onFullFill, nghĩa là xác định luồng khi tiếp tục khi nào nó success /resolved.

Trong trường hợp onReject, chúng ta in ra log như nó có thể được nhìn thấy.

Hàm parseHtmlToJson ()

Với hàm parseHtmlToJson (), đang cố gắng lấy dữ liệu từ nguồn trang ở định dạng chúng ta muốn.

Tôi không sai khi nói phần parseHtmlToJson () là phần quan trọng. Đây là phần mà tôi đã dành nỗ lực rất nhiều. Trước hết, truy cập nguồn trang từ url  https://covid19.saglik.gov.tr/ và kiểm tra các mã html với F12.

Khi kiểm tra các mã html, có thể thấy thông tin covid ngày cần trong n <div> với class giữa các thẻ <p>, ở định dạng ngày, tháng và năm, tương ứng. Sẽ sử dụng gói cheerio ở phần này.

covid  nodejs

Chúng ta cung cấp nội dung trang mà có trong hàm parseHtmlToJson làm tham số cho cheerio.load (). Và bằng cách chọn <div> với lớp lịch ở trên, chúng ta nhận được thông tin ngày, tháng và năm bằng cách lặp lại trên mỗi thẻ <p>. Ở trên, cũng sử dụng hàm findMonth () là thông tin tháng đến từ nguồn trang. Những gì cần là định dạng MM-05. Do đó, bạn có thể dễ dàng truy cập thông tin tháng với phần tử khớp + 1 chỉ số từ một mảng đơn giản với tháng.

Bây giờ đã có thông tin được sử dụng làm id, nhưng làm thế nào tiếp cận thông tin nguồn ban đầu ?

Một lần nữa, nếu kiểm tra nguồn trang, chúng ta thấy rằng dữ liệu được giữ trong <li> trong <ul> (danh sách không có thứ tự) trong div. Tại thời điểm này, tương tự, chuyển qua tất cả <li> của thẻ <ul> với cheerio và ném một đối tượng làm khóa – giá trị. (như x [“dữ liệu hàng ngày”] = 123). Sau đó, chúng ta cố gắng định dạng dữ liệu bằng các vòng lặp lồng nhau trên tất cả dữ liệu. Kết quả là một đoạn code như bên dưới.

covid nodejs

Bây giờ chúng ta đã có json được trả về từ hàm parseHtmlToJson (), có thể so sánh ngày hiện tại và id của dữ liệu đến trong saveDataToDb và quyết định có thêm hay không.

Chúng ta kiểm tra. Nếu không có dữ liệu hoặc dữ liệu mới đến từ bộ y tế, thêm nó vào db như sau.

Kết quả là, bây giờ chúng ta có một cấu trúc ghi dữ liệu của hàm đã xác định trong lệnh cấm lịch trình vào db bằng cách thực hiện các kiểm tra khác nhau. Chúng ta hãy làm các mục thứ 2 và thứ 3 tương ứng.

Kết luận

Qua bài viết, chúng ta đã hiểu được về mục 1 trong 3 mục. Trong bài viết tiếp theo, tôi sẽ tiếp tục giải thích tường tận về mục 2 và 3. Hãy cùng đón xem nhé ^^

Tham khảo thêm bài viết về NodeJS tại đây : Những cách tối ưu code NodeJS nên biết


Like it? Share with your friends!

1052
1.5k share, 1052 points

What's Your Reaction?

hate hate
0
hate
confused confused
0
confused
fail fail
0
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
1
lol
omg omg
1
omg
win win
1
win