สวัสดีผู้อ่านทุกท่านครับ วันนี้ผมจะพาทัวร์ทุกท่านไปพบกับ การเปรียบเทียบ ระหว่าง axios กับ Node-Fetch โดยผมจะเน้นไปที่ axios นะครับ…
ว่าแต่ทั้งสองตัวนี้มันคืออะไรกันหละ (คนที่ทราบแล้วข้ามไปข้างล่างเลยนะครับ)
เกริ่นสักนิด เวลาที่คุณต้องการจะติดต่อไปยัง Service ต่าง ๆ เช่น ที่เป็น RestfulAPI หรือ GraphQL คุณก็จะต้องส่งพวกข้อมูลต่าง ๆ เข้าไปผ่าน HTTP request ซึ่งคุณก็อาจจะใช้ HTTP method เช่น GET, PUT, POST หรือ อื่น ๆ โดยที่ Node.js ได้ Provide module https มาให้ไว้แล้ว
const http = require('https');
HTTP request ใช้สำหรับรับ และส่งข้อมูลระหว่าง Client กับ Server ซึ่งเอาให้เห็นภาพก็ HTTP method ที่เราใช้เรียก GET, POST, PUT, PATCH and other นั่นแหละ
อ่านมายังไม่ถึง 1 นาที บางท่านอาจจะรู้สึกว่า อ่าว เค้ามีมาให้แล้ว ทำไมเราถึงยังต้องไปใช้ตัวอื่นหละ ไปดูตัวอย่างกันซักหน่อยแล้วกัน
// using module https
const https = require('https')
const data = JSON.stringify({
msg: 'Hello World!!'
})
const options = {
hostname: 'your-domain.com',
port: 443,
path: '/posts',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': data.length
}
}
const req = https.request(options, res => {
console.log(`statusCode: ${res.statusCode}`)
res.on('data', d => {
process.stdout.write(d)
})
})
req.on('error', error => {
console.error(error)
})
req.write(data)
req.end()
มาดูของ axios กันหน่อย
// using axios
const axios = require('axios')
axios
.post('https://your-domain.com/posts', {
msg: 'Hello World!!'
})
.then(res => {
console.log(`statusCode: ${res.statusCode}`)
console.log(res)
})
.catch(error => {
console.error(error)
})
จะเห็นว่า ทั้งสองเจ้า Call ไปที่ your-domain.com/posts
ด้วย HTTP method post
จากตัวอย่างแค่นี้ อาจจะยังไม่เห็นภาพนะครับ แต่อาจจะพอทำให้เห็นว่ามันสั้นลงมาก เราไปกันต่อดีกว่า
What axios is?
axios เป็น Promise based HTTP client สำหรับ browser และ node.js โดยมี Feature หลัก ๆ ประมาณนี้
สร้าง XMLHttpRequests from the browser, สร้าง HTTP requests from node.js, รองรับการทำงาน Promise API, มี Intercept request and response, มีความสามารถในการ Transform request and response, มี Feature Cancel requests, Automatic transforms สำหรับ JSON และ Support for protecting against XSRF
What Node-Fetch is?
Node-Fetch เป็น Light-weight module ซึ่งทำให้เราใช้ window.fetch API
ร่วมกันใน Node.js ได้, เป็น Native promise แต่สามารถใช้ Promise library อื่น ๆ ที่คุณชอบทดแทนได้, ใช้ Native Node streams สำหรับทั้ง Request และ Response body, สามารถ Decode ข้อมูลต่าง ๆ และ Convert string output ได้ เช่น res.text()
or res.json()
ซึ่งจะเปลี่ยนเป็น UTF-8 ให้อัตโนมัติ, สามารถกำหนด Timeout, redirect limit, response size limit และ มีการ Response ข้อผิดพลาดที่ชัดเจนสำหรับการนำไปแก้ไขปัญหา
Advantage
axios และ Node-Fetch ทั้งคู่ล้วนเป็น Promise-based request library เพื่อที่จะทำ Perform HTTP request ที่จริงยังมีตัวอื่นอีกที่ถูกพัฒนาขึ้นมา แต่วันนี้เราจะพาไปดูข้อดีของ axios และ ลองทำการเปรียบเทียบระหว่าง axios กับ Node-fetch ในบางส่วนกันครับ
1. Axios ทำการแปลงข้อมูลเป็น JSON ให้เราโดยอัตโนมัติ
axios แปลงข้อมูลที่เราได้รับเป็น JSON ให้เราโดยอัตโนมัติ อันที่จริง Node-Fetch เค้าก็มีนะเพียงแต่ว่าเราจะต้องมาทำ response.json()
เอง อันนี้ที่จริงมันก็เล็กน้อยแหละ อาจจะใช้กันลืม
// node-fetch
fetch('https://your-domain.com/users/')
.then((res) => {
return res.json()
})// axios
axios.get('https://your-domain.com/users/')
.then((response) => return response)
2. axios จัดการกับ Error Handling ได้ดี
สิ่งที่ทำให้ axios ได้รับความนิยมก็คือ การจัดการกับข้อผิดพลาด เนื่องจากการเขียนด้วย axios มีการ Implement ที่สั้น ทำให้อ่านแล้วเข้าใจได้ง่ายกว่า
// node-fetch
fetch("https://your-domain.com/500")
.then(function() {
console.log("ok");
}).catch(function() {
console.log("error");
});
หากลอง run
code ด้านบนจะพบว่า fetch
จะไม่ตก Catch จะออก console.log("ok")
ทั้งที่จริง ๆ เราตก server error 500 (ที่ยกเคสมาคือเคสที่คิดว่าควรตก error แต่ไม่ยอมตกให้) คุณอาจจะต้องแก้ปัญหาพวกนี้ด้วยการทำตัว handle ขึ้นมา ดังตัวอย่างข้างล่าง
// node-fetch
const handleErrors = (res) => {
if (!res.ok) {
throw Error(res.statusText);
}
return res;
}fetch("https://your-domain.com/500")
.then(handleErrors)
.then(response => console.log("ok") )
.catch(error => console.log(error) );
มาดูฝั่ง axios กันบ้าง
// axios
try {
return await axios.get('https://your-domain.com/500');
} catch (err) {
throw err
}
จะเห็นว่าไม่ต้องทำอะไรเลย ถ้าหากเรายิงไปหา Server แล้วได้ Status 500 ตัว axios จะทำการเอาลง catch
เลยสะดวกมาก
3. Intercept request and response
axios มี Interceptor ให้ด้วย คุณสามารถปรับเปลี่ยน request ที่ได้รับมาก่อนจะโยนต่อ หรือปรับเปลี่ยนข้อมูลที่จะ response ได้ก่อนที่จะทำการ response จริง
เอาให้เข้าใจง่าย ๆ ก็คือ คุณสามารถใช้ Interceptor ในการแก้ไข หรือปรับเปลี่ยน Request ที่เข้ามา หรือ Response ก่อนออกไป ก่อนที่จะ Handle โดยใช้ .then
หรือ .catch
นั่นเอง
// Add a request interceptor
axios.interceptors.request.use(function (config) {
// Do something before request is sent
return config;
}, function (error) {
// Do something with request error
return Promise.reject(error);
});
// Add a response interceptor
axios.interceptors.response.use(function (response) {
// Any status code that lie within the range of 2xx cause this function to trigger
// Do something with response data
return response;
}, function (error) {
// Any status codes that falls outside the range of 2xx cause this function to trigger
// Do something with response error
return Promise.reject(error);
});
ถ้าใครงงตรงนี้ แนะนำให้ไปลองหาอ่านหลักการของ AOP Interceptor หรือ Interceptor ได้ครับ
4. axios มีความสามารถในการ Monitor POST request
ลองคิดดูว่าถ้าคุณมี Request ขนาดใหญ่ ซึ่งใช้เวลานานกว่าปกติ โดยที่คุณได้ทำการใช้ promise
.catch
เพื่อที่จะใช้ส่ง Error ที่เกิดขึ้น แต่ว่ามันนิ่งไปเลย ไม่มีอะไรเกิดขึ้น มันเหมือนเราเป็นคนตามืดบอดชัด ๆ ซึ่งเป็นไปได้ว่า Request ของเราอาจจะยังอยู่ในระหว่างดำเนินการ node-fetch ไม่ได้ให้วิธีการในการจัดการ Monitor กับคุณ แต่…
axios มี ดังเช่นตัวอย่างในการ Upload อะไรสักอย่าง
หรือไม่ว่าจะเป็นการทำ Progress bar
5. Cancel Request
บางครั้งเมื่อคุณทำการ Request ไปแล้ว แต่จู่ ๆ รู้สึกว่าเฮ้ยไม่อยากรอละ หรือไม่ได้สนใจผลลัพธ์นั้นแล้ว เจ้า axios เค้า Provide การทำ Cancel request มาให้คุณด้วย สามารถเอาไปประยุกต์ใช้ได้ อย่างคูล!!
วิธีการทำ Cancel request นั้น คุณจะต้อง Create cancel token ขึ้นมาก่อน โดยการเรียกจาก Library ได้เลย ดูตัวอย่างได้ในโค้ด
const CancelToken = axios.CancelToken;
const source = CancelToken.source();
axios.get('/user/12345', {
cancelToken: source.token
}).catch(function (thrown) {
if (axios.isCancel(thrown)) {
console.log('Request canceled', thrown.message);
} else {
// handle error
}
});
axios.post('/user/12345', {
name: 'new name'
}, {
cancelToken: source.token
})
// cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');
ตัวอย่าง Source Code ส่วนนี้นำมาจาก
6. axios มีความปลอดภัยมากกว่า และมี Feature Built In Cross Site Forgery (XSRF) Protection
Cross Site Forgery(XSRF) เป็นเทคนิคการโจมตีเว็บไซต์อย่างหนึ่ง ซึ่งเป็นที่นิยมในหมู่นักโจรกรรมข้อมูลอิเล็กทรอนิค Axios เค้าได้ทำการ Built In Cross Site Forgery(XSRF) Protection มาให้ซึ่งก็จะทำให้เรารู้สึกมั่นใจได้มากขึ้นอีกนิดนึง ทั้งนี้มันก็ขึ้นอยู่กับการเขียนโปรแกรมของคุณด้วยอยู่ดีนะครับ (อ่านต่อเรื่อง XSRF ได้จาก Link References ครับ)
7. มี Browser ที่รองรับ axios เยอะ
มาถึงตรงนี้ก็ต้องบอกว่า ไม่ว่าจะ node-fetch หรือ axios ทั้งคู่ต่างก็ทำออกมาให้ Browser เจ้าหลักทุกเจ้ารองรับกันอยู่แล้ว ทั้ง Google Chrome, Mozilla Firefox, Safari หรือ แม้กระทั่ง Internet Explorer แต่ที่เห็นจะดีหน่อยคือ Axios รองรับ Internet Explorer ตั้งแต่ Version 8 เป็นต้นไป ซึ่งตรงนี้ทำให้การใช้งาน Library ของคุณรองรับ Browser ที่เก่าหน่อยได้ด้วย
Conclusion
จากที่ผมใช้มาหลายตัว ทั้งที่มีแถมมาอย่าง “https” หรือ External third-party library อย่าง “request”, “node-fetch” จนกระทั่งมาเจอกับ Axios ต้องบอกว่า Axios ง่ายต่อการใช้งาน และทำความเข้าใจ มี Interceptor ให้ใช้ แถม XSRF Protection มาให้ด้วย ทำ Handle error ได้สะดวกกว่า มีความยืดหยุ่นกว่า รองรับ Browser ที่หลากหลายกว่า
ผิดพลาดประการใด ชี้แนะได้เลยนะครับ ^^
source : https://medium.com/@iamgique/%E0%B9%80%E0%B8%9B%E0%B8%A3%E0%B8%B5%E0%B8%A2%E0%B8%9A%E0%B9%80%E0%B8%97%E0%B8%B5%E0%B8%A2%E0%B8%9A%E0%B8%A3%E0%B8%B0%E0%B8%AB%E0%B8%A7%E0%B9%88%E0%B8%B2%E0%B8%87-axios-%E0%B8%81%E0%B8%B1%E0%B8%9A-node-fetch-991f7d90c36d
No comments:
Post a Comment