Published on
-
3 mins read

Node.js - Fetch JSON với HTTPS module

Authors
  • avatar
    Name
    Tuan Anh Huynh (Leo)
    Twitter
    @hta218
Photo by Tim Trad on Unsplash
switzerland

Khi làm việc với Node.js, có rất nhiều thư viện hỗ trợ việc tạo request đến 1 server khác như: node-fetch, phin, got hay request (Deprecated )...

Tuy nhiên nếu server của bạn đơn thuần chỉ làm API cho client App và bây giờ có 1 feature cần phải request đến 1 file json từ server khác, hoặc đơn giản là fetch 1 external API thì bạn sẽ chọn xài thư viện nào?

Liệu có cần thiết phải thêm vào package.json 1 dependency với cả rổ chức năng chỉ để tạo 1 request không?

Và câu trả lời là không! Vì đã có https module!

HTTPS

https là module được build sẵn trong Node.js chỉ việc lấy ra xài, rất nhẹ nhàng và được support ở hầu hết các version Node.js.

Tạo request với https như sau:

const https = require('https')
https
.get(url, (res) => {
let body = ''
res.on('data', (chunk) => (body += chunk))
res.on('end', () => {
try {
const json = JSON.parse(body)
// Now you can use json data...
} catch (err) {
console.error(`Failed to parse JSON data - ${err.toString()}`)
}
})
})
.on('error', (err) => {
console.error(`Failed to make request! Error: ${err.toString()}`)
})

Trong đó:

  • https là built-in module của Node.js nên có thể require luôn mà không cần install
  • Tạo request với https.get(url[, options][, callback])
  • Trong callback chúng ta sẽ listen các event của response với res.on()
  • Mỗi lần res.on("data") trigger, cộng thêm data vào string body
  • Kết thúc với res.on("end"), lúc này chỉ cần JSON.parse(body) là sẽ có JSON data mong muốn
  • Dòng 8 + 11: Lưu ý để parse trong try {} catch() {} để bắt lỗi nếu không parse được json!
  • Nếu không tạo được request thì event error sẽ được trigger

Đơn giản là như vậy! Bây giờ hãy abstract những logic này vào 1 function để sử dụng ở bất kì đâu trong server:

const https = require('https')
const fetchJSON = (url) => {
return new Promise((resolve, reject) => {
https
.get(url, (res) => {
let body = ''
res.on('data', (chunk) => (body += chunk))
res.on('end', () => {
try {
resolve(JSON.parse(body))
} catch (err) {
reject(err)
}
})
})
.on('error', reject)
})
}
module.exports = fetchJSON

Và sử dụng

// Async context
const data = await fetchJSON(url)
// Use data...

Chúc các bạn thành công!