สวัสดีครับ วันนี้จะมาเล่าเรื่องสั้น ๆ เกี่ยวกับการทำ 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 ได้สะดวกและรวดเร็วยิ่งขึ้น
![](https://b2dmain-ruk.cdn.jelastic.net/wp-content/uploads/2024/03/expressjs_logo-1024x729.png)
มาลองใช้งาน 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/