
Alo alo, Gen Z! Creyt đây, và hôm nay chúng ta sẽ cùng nhau khám phá một "công cụ" cực kỳ quyền năng trong bộ đồ nghề của một lập trình viên Node.js: https.get()! Nghe có vẻ khô khan nhưng tin anh đi, nó chính là chiếc chìa khóa để apps của mấy đứa "nói chuyện" được với thế giới bên ngoài đấy.
1. https.get() là gì mà nghe ngầu vậy anh Creyt?
Tưởng tượng thế này: App Node.js của mấy đứa đang ở nhà, cần lấy thông tin từ một "người hàng xóm" nào đó trên internet (ví dụ: dữ liệu thời tiết từ một API, hay một bài đăng trên blog). Thay vì tự mình chạy sang gõ cửa, mấy đứa sẽ cử một "người đưa thư đặc biệt" đi. https.get() chính là anh chàng người đưa thư đó!
Cụ thể hơn, https.get() trong Node.js là một phương thức được cung cấp bởi module https (đừng nhầm với http nhé, s ở đây là Secure - bảo mật đó!). Nhiệm vụ của nó là gửi một yêu cầu GET đến một địa chỉ web (URL) an toàn (có chứng chỉ SSL/TLS, tức là https:// chứ không phải http:// "trần truồng" đâu nha). "GET" ở đây có nghĩa là "Lấy về", giống như mấy đứa chỉ muốn xem thông tin thôi chứ không gửi gì đi cả.
Để làm gì? Đơn giản là để:
- Lấy dữ liệu từ API: Đây là ứng dụng phổ biến nhất. Ví dụ, lấy danh sách sản phẩm từ API của Shopee, hay thông tin người dùng từ API của Facebook (nếu có quyền).
- Đọc nội dung trang web: Mặc dù không phải là công cụ tối ưu cho web scraping phức tạp, nhưng nó là nền tảng để lấy về mã HTML của một trang web.
- Kiểm tra trạng thái dịch vụ: Xem một dịch vụ online nào đó có đang hoạt động hay không.
Nói chung, bất cứ khi nào app Node.js của mấy đứa cần "hỏi thăm" và "nhận thông tin" từ một nguồn bên ngoài qua đường internet một cách bảo mật, https.get() chính là lựa chọn cơ bản và tin cậy.
2. Code Ví Dụ: "Hàng xóm" ơi, cho tớ xin ít dữ liệu!
Giờ thì mình cùng xem anh chàng người đưa thư này hoạt động như thế nào qua một ví dụ cụ thể. Chúng ta sẽ "nhờ" https.get() lấy về một vài bài viết mẫu từ một API công cộng (JSONPlaceholder) nhé. Đây là một sân chơi tuyệt vời để mấy đứa thử nghiệm API mà không sợ làm hỏng gì của ai đâu.
const https = require('https');
const url = 'https://jsonplaceholder.typicode.com/posts/1'; // Lấy bài viết số 1
console.log('Đang cử người đưa thư đi lấy dữ liệu...');
https.get(url, (res) => {
let data = '';
// Khi có dữ liệu về, 'người đưa thư' sẽ đưa từng 'mẩu' nhỏ
res.on('data', (chunk) => {
data += chunk;
});
// Khi 'người đưa thư' đã mang về hết tất cả 'mẩu' dữ liệu
res.on('end', () => {
// Kiểm tra xem 'người hàng xóm' có trả lời OK không (mã 200)
if (res.statusCode === 200) {
try {
const post = JSON.parse(data); // Thử mở 'gói hàng' (chuỗi JSON) ra xem bên trong có gì
console.log('Dữ liệu đã về tới:', post);
console.log('Tiêu đề bài viết:', post.title);
} catch (e) {
console.error('Người đưa thư mang về gói hàng bị lỗi, không đọc được JSON:', e.message);
}
} else {
console.error(`Người đưa thư báo: "Người hàng xóm không OK!" - Mã trạng thái: ${res.statusCode}`);
}
});
}).on('error', (err) => {
// Ối! Người đưa thư gặp sự cố trên đường đi (mất mạng, sai địa chỉ...)
console.error('Người đưa thư gặp sự cố trên đường:', err.message);
});
Giải thích "sương sương" từng dòng code:
const https = require('https');: Kêu gọi anh chàng người đưa thư "https" vào làm việc.https.get(url, (res) => { ... });: Cử người đưa thư đi đếnurlvà dặn dò "khi nào có hồi âm thì về báo cáo lại qua hàmresnày nhé".reschính là "phản hồi" từ người hàng xóm.res.on('data', (chunk) => { ... });: Dữ liệu về thường không phải một cục mà là từng "mẩu" nhỏ (chunk). Mình phải gom từng mẩu lại vào biếndata.res.on('end', () => { ... });: Khi tất cả các mẩu đã về hết, đây là lúc mình có "gói hàng" hoàn chỉnh.res.statusCode === 200: Kiểm tra xem "người hàng xóm" có trả lời "OK, tôi gửi rồi đây!" (mã 200) hay "Xin lỗi, không có gì!" (mã 404), hay "Tôi đang bận!" (mã 500) không.JSON.parse(data);: Nếu dữ liệu là JSON, thì phải "mở gói hàng" ra để dùng được. Nhớtry...catchvì lỡ gói hàng không phải JSON chuẩn thì sao?.on('error', (err) => { ... });: Đây là phần cực kỳ quan trọng! Lỡ người đưa thư gặp sự cố trên đường (mất mạng, địa chỉ không tồn tại) thì sao? Phải có cách để xử lý chứ!

3. Mẹo "sống còn" khi dùng https.get() (Best Practices) của anh Creyt
Dùng https.get() cũng giống như lái xe vậy, biết lái thôi chưa đủ, phải biết mẹo để lái an toàn và hiệu quả:
- LUÔN LUÔN xử lý lỗi (
.on('error')): Đây là điều tiên quyết! Mạng có thể rớt, server có thể sập, URL có thể sai. Nếu mấy đứa không xử lý lỗi, app của mấy đứa sẽ "crash" ngay lập tức. Giống như không đeo dây an toàn khi lái xe vậy. - Kiểm tra
res.statusCode: Đừng bao giờ tin tưởng mù quáng rằng dữ liệu về là "ngon". Mã 200-299 là thành công. 4xx là lỗi từ phía client (mấy đứa gửi sai gì đó), 5xx là lỗi từ phía server (người hàng xóm có vấn đề). - Cẩn thận khi
JSON.parse(): Dữ liệu từ ngoài internet không phải lúc nào cũng là JSON hợp lệ. Luôn bọc nó trongtry...catchđể tránh app bị sập nếu dữ liệu "lởm". - Gom đủ "mẩu" dữ liệu: Nhớ dùng biến
datađể nối cácchunklại. Nếu không, mấy đứa chỉ có thể đọc được một phần dữ liệu thôi. - Hạn chế dùng
https.get()trực tiếp cho tác vụ phức tạp: Đối với các ứng dụng thực tế, mấy đứa sẽ thấy các thư viện nhưaxioshoặcnode-fetchđược dùng nhiều hơn. Chúng nó là "người đưa thư phiên bản nâng cấp", có nhiều tính năng tiện lợi hơn (tự động parse JSON, xử lý lỗi tốt hơn, cấu hình request dễ dàng hơn...).https.get()là nền tảng, nhưng đôi khi cần "đồ chơi" xịn hơn.
4. Ứng dụng thực tế: Ai đang dùng https.get() (hoặc anh em của nó)?
Hầu hết các ứng dụng web và di động mà mấy đứa đang dùng hàng ngày đều sử dụng cơ chế này (hoặc các thư viện xây dựng trên nó) để giao tiếp với server:
- Mấy app mạng xã hội (Facebook, Instagram, TikTok): Khi mấy đứa lướt feed, app sẽ dùng
https.get()(hoặc tương đương) để lấy về các bài đăng, ảnh, video mới từ server. - Các trang thương mại điện tử (Shopee, Lazada, Tiki): Khi mấy đứa tìm kiếm sản phẩm, xem chi tiết sản phẩm, app sẽ gửi request để lấy thông tin sản phẩm, giá cả, đánh giá.
- Các dịch vụ thời tiết, bản đồ: Lấy dữ liệu dự báo thời tiết, thông tin địa điểm, lộ trình từ các API chuyên biệt.
- Các backend Node.js: Một microservice có thể dùng
https.get()để lấy dữ liệu từ một microservice khác (ví dụ: dịch vụ quản lý người dùng lấy thông tin từ dịch vụ quản lý đơn hàng).
5. Thử nghiệm và Nên dùng cho case nào?
Thử nghiệm đã từng: Anh Creyt đã từng dùng https.get() trong những ngày đầu để xây dựng một con bot Telegram đơn giản. Con bot này cần lấy tỷ giá tiền tệ từ một API mỗi giờ. https.get() hoàn thành nhiệm vụ rất tốt vì yêu cầu đơn giản, chỉ cần GET dữ liệu JSON và không có quá nhiều cấu hình phức tạp. Nó nhẹ nhàng và không cần thêm thư viện nào cả.
Nên dùng cho case nào?
- Học tập và làm quen: Đây là cách tuyệt vời để hiểu cách Node.js tương tác với internet ở cấp độ thấp nhất.
- Các request GET đơn giản, không cần cấu hình phức tạp: Nếu mấy đứa chỉ cần lấy về một tệp tin JSON hoặc HTML mà không cần gửi header tùy chỉnh, authentication phức tạp, hay xử lý body request,
https.get()là đủ. - Khi muốn tối giản dependency: Nếu dự án của mấy đứa cần nhỏ gọn nhất có thể và không muốn thêm thư viện bên ngoài,
https.get()là lựa chọn mặc định. - Xây dựng các thư viện HTTP riêng: Nếu mấy đứa muốn tự xây dựng một thư viện HTTP "xịn xò" hơn,
https.get()(vàhttps.request) là nền tảng cơ bản để bắt đầu.
Tuy nhiên, nếu mấy đứa đang xây dựng một ứng dụng lớn, có nhiều loại request (POST, PUT, DELETE), cần quản lý header, timeout, retry logic, hay muốn tích hợp dễ dàng với Promise/async-await, thì hãy nghĩ đến việc "nâng cấp" lên axios hay node-fetch. Chúng sẽ giúp mấy đứa tiết kiệm rất nhiều thời gian và công sức đấy!
Tóm lại, https.get() giống như việc mấy đứa học cách tự xây một chiếc xe đạp. Nó là nền tảng vững chắc để hiểu cơ chế hoạt động. Còn khi cần đi xa hơn, nhanh hơn, thoải mái hơn, thì có thể mấy đứa sẽ muốn mua một chiếc xe hơi (như axios chẳng hạn). Nhưng không có chiếc xe đạp nào thì làm sao hiểu được động cơ xe hơi hoạt động thế nào, đúng không?
Thuộc Series: Nodejs
Bài giảng này được tự động xuất bản ngẫu nhiên từ thư viện kiến thức. Đừng quên đón xem các Từ khoá Hướng Dẫn tiếp theo nhé!