กลยุทธ์การจัดการข้อผิดพลาดทั่วทั้งระบบ
นำกลไกจัดการข้อผิดพลาดแบบรวมศูนย์มาใช้ เพื่อจัดการข้อยกเว้นอย่างเหมาะสมและส่งการตอบกลับข้อผิดพลาดที่สอดคล้องกัน
กลยุทธ์การจัดการข้อผิดพลาดทั่วทั้งระบบ เป็นบทเรียน Node.js Backend Development Bootcamp ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Node.js Backend Development Bootcamp และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Node.js Backend Development Bootcamp มีบทเรียนทั้งหมด 4 บทเรียน
บางส่วนของบทเรียนนี้ยังไม่ได้รับการแปล และแสดงเป็นภาษาอังกฤษ
Centralized Errors in Express
When building an API, errors are inevitable. How you handle them can drastically affect user experience and application stability.
Scattered try...catch blocks in every route can become messy and inconsistent. This lesson introduces global error handling in Express.js.
Express's Default Error Response
By default, if an error occurs in an Express route or middleware and isn't caught, Express will:
- Send a response with a
500 Internal Server Errorstatus code. - Include the error's stack trace in the response.
This default behavior is not ideal for production, as it exposes sensitive server details to clients.
The Special Error Middleware
Express recognizes a special type of middleware for error handling. Unlike regular middleware which takes (req, res, next), error-handling middleware takes four arguments:
err: The error object passed by Express.req: The request object.res: The response object.next: The next middleware function.
Express knows to skip all other middleware and send the error directly to this special handler.
Your First Error Middleware
Let's create a basic error handling middleware. This middleware should be placed after all other routes and middleware in your app.js file.
Try running this simple Express app:
const express = require('express');
const app = express();
// A route that intentionally throws an error
app.get('/error', (req, res, next) => {
const err = new Error('Something went wrong!');
err.statusCode = 400;
next(err); // Pass the error to the error middleware
});
// Global Error Handling Middleware (must be last)
app.use((err, req, res, next) => {
console.error(err.stack); // Log the error for debugging
const statusCode = err.statusCode || 500;
res.status(statusCode).json({
status: 'error',
message: err.message || 'An unexpected error occurred!'
});
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
console.log('Visit http://localhost:3000/error to see error handling');
});Operational vs. Programmatic Errors
It's crucial to distinguish between error types:
- Operational Errors: Predictable errors from system operations (e.g., invalid user input, network issues, resource not found). These are 'soft' errors we can handle gracefully and send specific messages to the client.
- Programmatic Errors: Bugs in your code (e.g., trying to read property of
undefined, database connection failures). These are 'hard' errors that indicate a problem with your application logic and might require restarting the process.
Our global handler should treat these differently.
Crafting Custom Errors
To better categorize and handle errors, we can create custom error classes. This allows us to attach specific properties like statusCode and isOperational to our errors.
Here's a simple AppError class:
// utils/appError.js
class AppError extends Error {
constructor(message, statusCode) {
super(message);
this.statusCode = statusCode;
this.status = `${statusCode}`.startsWith('4') ? 'fail' : 'error';
this.isOperational = true;
Error.captureStackTrace(this, this.constructor);
}
}
module.exports = AppError;Using Custom Errors in Routes
Now that we have our AppError class, we can use it in our routes to throw specific, operational errors. When an AppError is thrown and caught by next(err), our global handler can provide a tailored response.
Run this example and try visiting /user/123 (valid) and /user/abc (invalid ID):
const express = require('express');
const AppError = require('./utils/appError'); // Assuming appError.js is in a 'utils' folder
const app = express();
// Example route using custom error
app.get('/user/:id', (req, res, next) => {
const userId = parseInt(req.params.id);
if (isNaN(userId)) {
return next(new AppError('Invalid user ID provided!', 400));
}
res.status(200).json({
status: 'success',
data: { id: userId, name: `User ${userId}` }
});
});
// Global Error Handling Middleware (must be last)
app.use((err, req, res, next) => {
console.error(err.stack);
const statusCode = err.statusCode || 500;
const status = err.status || 'error';
if (err.isOperational) {
res.status(statusCode).json({
status: status,
message: err.message
});
} else {
// For programmatic errors, send a generic message in production
res.status(500).json({
status: 'error',
message: 'Something went very wrong!'
});
}
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
console.log('Visit http://localhost:3000/user/1 to see success');
console.log('Visit http://localhost:3000/user/abc to see custom error');
});
// --- Create utils/appError.js with the content from the previous scene for this to run ---Intelligent Error Responses
Our error handler can be further refined to provide different responses based on the environment (development vs. production).
- Development: Send full error details (stack trace) for debugging.
- Production: Send minimal, user-friendly messages for operational errors and generic messages for programmatic errors (to hide internal details).
This approach keeps your API secure and informative.
Catching the Unforeseen
Express middleware only catches errors that occur within the request-response cycle and are passed with next(err). What about errors outside of this?
- Uncaught Exceptions: Synchronous errors that are not handled by any
try...catchblock. - Unhandled Rejections: Promise rejections that don't have a
.catch()handler.
Node.js provides global process event listeners for these critical errors, which should ideally shut down the application after logging the error.
// In your server.js or app.js, before app.listen
process.on('uncaughtException', err => {
console.error('UNCAUGHT EXCEPTION! Shutting down...');
console.error(err.name, err.message, err.stack);
process.exit(1); // Exit with failure code
});
// After app.listen, for unhandled promise rejections
process.on('unhandledRejection', err => {
console.error('UNHANDLED REJECTION! Shutting down...');
console.error(err.name, err.message);
// Optionally close server first, then exit
server.close(() => {
process.exit(1);
});
});Error Handling Challenge
You've learned about Express error handling. Which of the following is the correct signature for an Express error handling middleware?
Global Error Handling Summary
Great job! You've learned how to implement robust error handling in your Express applications.
- Express uses a special 4-argument middleware for error handling.
- Distinguish between operational and programmatic errors.
- Create custom error classes to add context to your errors.
- Implement global listeners for uncaught exceptions and unhandled rejections.
Centralized error handling makes your API more reliable, secure, and easier to debug!
คำถามที่พบบ่อย
บทเรียน “กลยุทธ์การจัดการข้อผิดพลาดทั่วทั้งระบบ” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “กลยุทธ์การจัดการข้อผิดพลาดทั่วทั้งระบบ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Node.js Backend Development Bootcamp ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Node.js Backend Development Bootcamp มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “กลยุทธ์การจัดการข้อผิดพลาดทั่วทั้งระบบ”
นำกลไกจัดการข้อผิดพลาดแบบรวมศูนย์มาใช้ เพื่อจัดการข้อยกเว้นอย่างเหมาะสมและส่งการตอบกลับข้อผิดพลาดที่สอดคล้องกัน คุณปฏิบัติ Node.js Backend Development Bootcamp ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Node.js Backend Development Bootcamp หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Node.js Backend Development Bootcamp บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “กลยุทธ์การจัดการข้อผิดพลาดทั่วทั้งระบบ” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Node.js Backend Development Bootcamp นี้ได้ไหม
ได้ บทเรียน Node.js Backend Development Bootcamp ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การพัฒนามิดเดิลแวร์ Express แบบกำหนดเอง
- กลยุทธ์การจัดการข้อผิดพลาดทั่วทั้งระบบ
- การตรวจสอบอินพุตด้วย Joi/Express-Validator
- มิดเดิลแวร์ยืนยันตัวตนด้วย JWT