สวัสดีครับ วันนี้จะมาเล่าเรื่องสั้น ๆ เกี่ยวกับการทำ Error Handling ใน Express.js กันนะครับ
Error Handling คืออะไร?
Error Handling คือ การจัดการข้อผิดพลาด ซึ่งเมื่อเกิด Error ขึ้นอาจส่งผลให้การทำงานของโปรแกรมล้มเหลว จึงต้องมีการเขียน Error handling เพื่อแสดงสาเหตุของข้อผิดพลาดนั้นและทำให้โปรแกรมสามารถทำงานต่อไปได้
Express.js คืออะไร?
Express.js เป็น Web Application Framework บน Node.js ที่ได้รับความนิยมมากๆตัวหนึ่ง ซึ่งตัว Express มี ต่างๆที่ Features ช่วยให้เราทำเว็บได้สะดวกขึ้น เช่น Routing, Middleware การจัดการ Request และ Response เป็นต้น ทำให้สามารถพัฒนาเว็บโดยใช้ Node.js ได้สะดวกและรวดเร็วยิ่งขึ้น
มาลองใช้งาน Error Handling ใน Express กัน!
มาเริ่มที่การเขียน Express.js ขึ้นมาง่าย ๆ กันก่อน
const express = require("express");
const app = express();
const port = 3000;
const products = [
{ id: 1, name: 'Laptop', category: 'Electronics', price: 1000, stock: 5 },
{ id: 2, name: 'Phone', category: 'Electronics', price: 500, stock: 10 }
];
// use Middleware for parsing JSON
app.use(express.json())
// List Products
app.get("/products", (req, res) => {
res.json(products);
});
// Create Product
app.post("/product", (req, res) => {
const product = req.body;
products.push(product);
res.status(201).json(product);
});
// Run Server at localhost port 3000
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
โค้ดด้านบนนี้คือ ระบบจัดการสินค้าที่ผู้ใช้สามารถเพิ่มสินค้าใหม่ และดูสินค้าทั้งหมดได้
ปัญหาของโค้ดนี้มีด้วยหรอ?
ใช่ครับ ในส่วนของ /product มีการรับ req.body เข้ามา ถ้าหาก req.body เป็นค่าว่าง หรือส่งเป็นข้อมูลเปล่า ๆ โปรแกรมไม่ควรบันทึกลงใน products ดังนั้นผมจะขอเสนอเทคนิคในการใช้งาน Error Handling กันนะครับ
อันดับแรกเราจะกันไม่ให้ผู้ใช้สามารถส่งค่าว่าง หรือข้อมูลเปล่า ๆ เข้ามาได้นะครับ
app.post("/product", (req, res) => {
const product = req.body;
if (Object.keys(product).length === 0) {
throw new Error("ไม่มีข้อมูลสินค้า")
}
products.push(product);
res.status(201).json(product);
});
เทคนิคที่ 1 การใช้ Middleware เพื่อจัดการข้อผิดพลาด
หากมีการ throw error โปรแกรมของเราจะทำการเรียกใช้ Middleware ที่เราสร้างจะถูกเรียกใช้งาน มาลองเพิ่มโค้ดเริ่มใช้งานกัน :
app.use((err, req, res, next) => {
console.error(err);
res.status(500).send("เกิดข้อผิดพลาด: " + err.message);
});
การใช้ Middleware ในการจัดการข้อผิดพลาด เป็นวิธีที่เรียบง่าย และมั่นคง โดยเขียนเพียงครั้งเดียวเท่านั้น แต่สามารถใช้กับทุก Endpoint ในโปรแกรมของเรา
ให้ Middleware ทำงานเฉพาะ Endpoint ที่กำหนด
หากต้องการให้ Middleware ทำงานเฉพาะ Endpoint ที่กำหนดเท่านั้น
app.use("/product",(err, req, res, next) => {
console.error(err);
res.status(500).send("เกิดข้อผิดพลาด: " + err.message);
});
เทคนิคที่ 2 try…catch
ต่อมาเราจะพามารู้จักกับ try…catch ที่ช่วยในการจัดการข้อผิดพลาดภายในโค้ด หากเกิดข้อผิดพลาดขึ้นภายใน try โค้ดที่อยู่ภายใน catch จะถูกทำงาน เราจะจำลองให้เกิดข้อพลาดที่พื้นที่ของ try :
app.get("/", (req, res) => {
try {
throw new Error("bug!!");
} catch (err) {
res.status(400).json({ error: err.message });
}
});
ในบางครั้ง เราอาจต้องการจัดการกับข้อผิดพลาดที่เกิดขึ้นภายในเงื่อนไข หรือการทำงานที่ซับซ้อน โดยการใช้ try…catch นั้นสามารถจัดการกับข้อผิดพลาดได้อย่างมีประสิทธิภาพ
เทคนิคที่ 3 Custom Error
Custom Error เป็นการสร้าง Error เอง โดยกำหนด message และ statusCode เอง ช่วยให้นักพัฒนาสามารถควบคุม Response และแสดงข้อความที่ชัดเจนแก่ผู้ใช้
ข้อดี คือ ควบคุม Response ได้ละเอียด แสดงข้อความที่ชัดเจนแก่ผู้ใช้ แยกประเภทของ Error ได้
class ProductError extends Error {
constructor(message) {
super(message);
this.statusCode = 400;
}
}
app.get("/product/:id", (req, res) => {
const id = req.params.id;
const product = products.find((p) => p.id === id);
if (!product) {
throw new ProductError("ไม่พบสินค้า");
}
res.json(product);
});
Custom Error เป็นเครื่องมือที่มีประสิทธิภาพ ช่วยให้จัดการ Error และแสดงข้อความที่ชัดเจนแก่ผู้ใช้
สรุป
การทำ Error Handling ใน Express.js เป็นกระบวนการจัดการข้อผิดพลาดที่เกิดขึ้นในแอปพลิเคชัน Express.js เพื่อให้โปรแกรมยังคงทำงานได้ถูกต้องและมีประสิทธิภาพ โดยใน Express.js เราสามารถใช้ Middleware หรือ try…catch เพื่อจัดการกับข้อผิดพลาดได้ ซึ่งการทำ Error Handling ช่วยลดความเสี่ยงในการเกิดข้อผิดพลาดและทำให้โปรแกรมมีความเสถียรมากยิ่งขึ้น
อ้างอิง
- Error handling in Express / Node.js, สืบค้นเมื่อ 27/3/2567
จาก: https://pongsakornsemsuwan.medium.com/error-handling-in-express-node-js-1f527f17db3a - Express error handing สืบค้นเมื่อ 27/3/2567 จาก: https://expressjs.com/en/guide/error-handling.html
- How To Implement Custom Error Responses in Express สืบค้นเมื่อ 27/3/2567 จาก: https://auth0.com/blog/how-to-implement-custom-error-responses-in-expressjs/