Skip to main content
0

สวัสดีครับ วันนี้จะมาเล่าเรื่องสั้น ๆ เกี่ยวกับการทำ 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 ช่วยลดความเสี่ยงในการเกิดข้อผิดพลาดและทำให้โปรแกรมมีความเสถียรมากยิ่งขึ้น

อ้างอิง

  1. Error handling in Express / Node.js, สืบค้นเมื่อ 27/3/2567
    จาก: https://pongsakornsemsuwan.medium.com/error-handling-in-express-node-js-1f527f17db3a
  2. Express error handing สืบค้นเมื่อ 27/3/2567 จาก: https://expressjs.com/en/guide/error-handling.html
  3. How To Implement Custom Error Responses in Express สืบค้นเมื่อ 27/3/2567 จาก: https://auth0.com/blog/how-to-implement-custom-error-responses-in-expressjs/
Pornput Sooduppatham

Author Pornput Sooduppatham

IT KMUTT

More posts by Pornput Sooduppatham

เราใช้คุกกี้เพื่อพัฒนาประสิทธิภาพ และประสบการณ์ที่ดีในการใช้เว็บไซต์ของคุณ คุณสามารถศึกษารายละเอียดได้ที่ นโยบายความเป็นส่วนตัว และสามารถจัดการความเป็นส่วนตัวเองได้ของคุณได้เองโดยคลิกที่ ตั้งค่า

ตั้งค่าความเป็นส่วนตัว

คุณสามารถเลือกการตั้งค่าคุกกี้โดยเปิด/ปิด คุกกี้ในแต่ละประเภทได้ตามความต้องการ ยกเว้น คุกกี้ที่จำเป็น

ยอมรับทั้งหมด
จัดการความเป็นส่วนตัว
  • คุกกี้ที่จำเป็น
    เปิดใช้งานตลอด

    ประเภทของคุกกี้มีความจำเป็นสำหรับการทำงานของเว็บไซต์ เพื่อให้คุณสามารถใช้ได้อย่างเป็นปกติ และเข้าชมเว็บไซต์ คุณไม่สามารถปิดการทำงานของคุกกี้นี้ในระบบเว็บไซต์ของเราได้
    รายละเอียดคุกกี้

  • คุกกี้สำหรับการติดตามทางการตลาด

    ประเภทของคุกกี้ที่มีความจำเป็นในการใช้งานเพื่อการวิเคราะห์ และ นำเสนอโปรโมชัน สินค้า รวมถึงหลักสูตรฟรี และ สิทธิพิเศษต่าง ๆ คุณสามารถเลือกปิดคุกกี้ประเภทนี้ได้โดยไม่ส่งผลต่อการทำงานหลัก เว้นแต่การนำเสนอโปรโมชันที่อาจไม่ตรงกับความต้องการ
    รายละเอียดคุกกี้

บันทึกการตั้งค่า