Hướng dẫn Xử lý ngoại lệ trong Express PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Hướng dẫn xử lý ngoại lệ trong Express

Giới thiệu

Các ngoại lệ và lỗi chắc chắn sẽ xảy ra trong khi người dùng tương tác với bất kỳ ứng dụng nào, tùy thuộc vào các kỹ sư phần mềm để chọn một phương tiện để xử lý bất kỳ lỗi nào có thể phát sinh – dù cố ý hay vô tình. Do đó, các nhà phát triển phụ trợ xây dựng API bằng Express thấy rằng họ đang làm việc để đảm bảo rằng họ đang xây dựng một API hữu ích, hiệu quả và có thể sử dụng được. Điều quan trọng nhất là xử lý các lỗi theo cách để xây dựng một hệ thống mạnh mẽ vì điều này giúp giảm thời gian phát triển, các lỗi hoàn toàn, các vấn đề về năng suất và quyết định sự thành công hoặc khả năng mở rộng của quá trình phát triển phần mềm.

Bạn có cần ghi lại thông báo lỗi, khắc phục lỗi, thông báo cho người dùng về lỗi hoặc viết mã để xử lý lỗi không? Không còn thắc mắc nữa.

Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách xây dựng một cơ sở mã xử lý lỗi mạnh mẽ cho các ứng dụng Express, cơ sở mã này sẽ giúp phát hiện lỗi ứng dụng và thực hiện các hành động tối ưu để khôi phục bất kỳ ứng dụng nào bị lỗi trong thời gian chạy.

Lưu ý: Chúng tôi sẽ sử dụng Postman để kiểm tra API trong bản trình diễn của chúng tôi. Bạn có thể tải xuống trên Trang tải xuống người đưa thư. Ngoài ra, bạn chỉ cần sử dụng trình duyệt, dòng lệnh curl công cụ hoặc bất kỳ công cụ nào khác mà bạn có thể quen thuộc.

Xử lý lỗi là gì?

Trong phát triển phần mềm, có hai loại ngoại lệ khác nhau: hoạt độnglập trình.

  • Các lỗi vận hành có thể phát sinh trong thời gian chạy và để ngăn ứng dụng kết thúc đột ngột, chúng ta phải xử lý khéo léo các ngoại lệ này thông qua các phương pháp xử lý lỗi hiệu quả.
  • Các ngoại lệ có lập trình được lập trình viên đưa ra theo cách thủ công khi một trạng thái ngoại lệ phát sinh.

Bạn có thể coi các ngoại lệ hoạt động là các ngoại lệ "bất ngờ, nhưng có thể thấy trước" (chẳng hạn như truy cập vào một chỉ mục ngoài giới hạn) và các ngoại lệ có lập trình là các ngoại lệ "được mong đợi và biết trước" (chẳng hạn như ngoại lệ định dạng số).

Xử lý ngoại lệ là quy trình được sử dụng để tìm và sửa lỗi trong chương trình. Xử lý lỗi gửi thông báo bao gồm loại lỗi đã xảy ra và ngăn xếp nơi xảy ra lỗi.

Lưu ý: Trong khoa học máy tính, các trường hợp ngoại lệ có thể khôi phục được và thường xuất phát từ các sự cố vận hành hoặc lập trình trong thời gian chạy. Lỗi thường phát sinh từ các yếu tố bên ngoài, chẳng hạn như giới hạn phần cứng, sự cố kết nối, thiếu bộ nhớ, v.v. Trong JavaScript, các thuật ngữ này thường được sử dụng thay thế cho nhau và các ngoại lệ tùy chỉnh được lấy từ Error lớp học. Các Error bản thân lớp đại diện cho cả lỗi và ngoại lệ.

Trong Express, xử lý ngoại lệ đề cập đến cách Express tự thiết lập để nắm bắt và xử lý các ngoại lệ đồng bộ và không đồng bộ. Điểm hay của việc xử lý ngoại lệ trong Express là với tư cách là nhà phát triển, bạn không cần phải viết trình xử lý ngoại lệ của riêng mình; Express đi kèm với một trình xử lý ngoại lệ mặc định. Trình xử lý ngoại lệ giúp xác định lỗi và báo cáo cho người dùng. Nó cũng cung cấp các chiến lược khắc phục khác nhau và thực hiện chúng để giảm thiểu các trường hợp ngoại lệ.

Mặc dù những thứ này có vẻ giống như rất nhiều thứ nằm trong tầm kiểm soát, nhưng việc xử lý ngoại lệ trong Express không làm chậm quá trình tổng thể của một chương trình hoặc tạm dừng quá trình thực thi của nó.

Hiểu xử lý ngoại lệ trong Express

Với trình xử lý lỗi mặc định đi kèm với Express, chúng tôi có trong tay một tập hợp các chức năng phần mềm trung gian giúp tự động bắt lỗi trong trình xử lý tuyến đường. Chẳng bao lâu nữa, chúng tôi sẽ tạo một dự án để áp dụng lý thuyết vào thực tế về cách trả lại các lỗi phù hợp trong ứng dụng Express và cách không làm rò rỉ thông tin nhạy cảm.

Xác định chức năng phần mềm trung gian trong Express

Các chức năng phần mềm trung gian xử lý lỗi được xác định theo cách mà chúng chấp nhận một Error object làm tham số đầu vào đầu tiên, theo sau là các tham số mặc định của bất kỳ chức năng phần mềm trung gian nào khác: request, responsenext. Các next() chức năng bỏ qua tất cả phần mềm trung gian hiện tại để chuyển sang trình xử lý lỗi tiếp theo cho bộ định tuyến.

Thiết lập xử lý lỗi trong Express

Chạy lệnh sau trong thiết bị đầu cuối của bạn để tạo ứng dụng Node và Express:

$ mkdir error-handling-express

Trong thư mục vừa tạo, hãy khởi tạo một dự án Node mới:

$ cd error-handling-express && npm init -y

Điều này tạo ra một package.json tập tin trong thư mục của chúng tôi.

Để tạo một máy chủ Express trong ứng dụng Node của chúng tôi, chúng tôi phải cài đặt express gói, dotenv để tự động tải các biến môi trường vào .env nộp vào process.env đối tượng, và nodemon để khởi động lại ứng dụng nút nếu thay đổi tệp được ghi chú trong thư mục.

$ npm install express dotenv nodemon

Tiếp theo, tạo một app.js tệp trong thư mục dự án sẽ đóng vai trò là tệp chỉ mục cho ứng dụng.

Bây giờ chúng tôi đã cài đặt tất cả các phụ thuộc cần thiết cho ứng dụng Express của mình, chúng tôi cần thiết lập tập lệnh để đọc ứng dụng trong package.json tập tin. Để đạt được điều đó, các package.json tập tin, do đó scripts đối tượng như hình bên dưới:

"scripts": {
    "start": "nodemon app.js"
},

Ngoài ra, bạn có thể bỏ qua bằng cách sử dụng nodemon, Và sử dụng node app.js thay thế.

Thiết lập máy chủ Express

Để thiết lập máy chủ, trước tiên chúng ta phải nhập các gói khác nhau vào app.js. Chúng tôi cũng sẽ tạo một .env file trong thư mục dự án – để lưu trữ tất cả các biến môi trường cho ứng dụng:



const express = require('express')
require('dotenv').config

PORT=4000 

Chúng tôi đã xác định số cổng cho ứng dụng trong .env, được tải vào và đọc bởi dotenv, và có thể được truy cập sau này.

Khởi tạo Express Server

Bây giờ, chúng tôi cần khởi tạo máy chủ Express và làm cho ứng dụng của chúng tôi lắng nghe số cổng ứng dụng, cùng với yêu cầu tuyến đường thử nghiệm – /test. Hãy cập nhật app.js, bên dưới báo cáo nhập khẩu:


const app = express();
const port = process.env.PORT || 4000;

app.get("/test", async (req, res) => {
    return res.status(200).json({ success: true });
});

app.listen(port, () => {
    console.log(`Server is running at port ${port}`);
});

Từ đây trở đi, chúng ta sẽ tìm hiểu cách xử lý các trường hợp sử dụng khác nhau của các lỗi vận hành có thể gặp phải trong Express.

Xử lý lỗi Not Found trong Express

Giả sử bạn cần tìm nạp tất cả người dùng từ cơ sở dữ liệu người dùng, bạn có thể xử lý hiệu quả tình huống lỗi tiềm ẩn khi không có dữ liệu nào trong cơ sở dữ liệu, bằng cách gói logic vào một try/catch khối - hy vọng bắt được bất kỳ lỗi nào có thể chiếu trong catch khối:


const getUser = () => undefined;

app.get("/get-user", async (req, res) => {
	try {
		const user = getUser();
		if (!user) {
			throw new Error('User not found');
		}
	} catch (error) {
	    
		console.log(error); 
		
		res.status(400).send(error.message) 
	}
	return res.status(200).json({
		success: true
	});
});

Kết quả này trong:

User not found

Bây giờ, khi yêu cầu này được thực hiện (bạn có thể kiểm tra bằng Postman) và không có người dùng nào tồn tại trên cơ sở dữ liệu, máy khách sẽ nhận được thông báo lỗi cho biết “Không tìm thấy người dùng”. Ngoài ra, bạn sẽ nhận thấy rằng lỗi cũng được ghi vào bảng điều khiển.

Tối ưu hóa xử lý lỗi với phần mềm trung gian xử lý lỗi

Chúng ta có thể tối ưu hóa quá trình phát triển bằng cách tạo một phần mềm trung gian xử lý lỗi sẽ xuất hiện ở cuối tất cả các tuyến đã xác định, để nếu một lỗi xuất hiện ở một trong các tuyến, Express sẽ tự động xem xét phần mềm trung gian tiếp theo và tiếp tục đi xuống danh sách cho đến khi nó đến trình xử lý lỗi. Trình xử lý lỗi sẽ xử lý lỗi và cũng gửi lại phản hồi cho khách hàng.

Xem hướng dẫn thực hành, thực tế của chúng tôi để học Git, với các phương pháp hay nhất, các tiêu chuẩn được ngành công nghiệp chấp nhận và bảng lừa đảo đi kèm. Dừng lệnh Googling Git và thực sự học nó!

Để bắt đầu, hãy tạo một thư mục có tên middleware trong thư mục dự án và trong thư mục này, hãy tạo một tệp có tên errorHandler.js trong đó xác định trình xử lý lỗi:

const errorHandler = (error, req, res, next) => {
    
    console.log(error); 
    
    res.status(400).send(error.message); 
}
module.exports = errorHandler;

Trong chức năng phần mềm trung gian của chúng tôi, chúng tôi đã cho Express biết rằng đây không phải là chức năng phần mềm trung gian cơ bản, mà là một trình xử lý lỗi, bằng cách thêm error tham số trước 3 tham số cơ bản.

Bây giờ, chúng tôi sẽ sử dụng trình xử lý lỗi trong bản demo của chúng tôi app.js và xử lý lỗi ban đầu khi tìm nạp người dùng bằng phần mềm trung gian xử lý lỗi, như minh họa bên dưới:


const getUser = () => undefined;

app.get("/get-user", async (req, res, next) => {
	try {
		const user = getUser();
		if (!user) {
			throw new Error("User not found");
		}
	} catch (error) {
		return next(error);
	}
});

app.use(errorHandler);

Chúng ta có thể tối ưu hóa mã của mình hơn nữa bằng cách tạo một trừu tượng xung quanh try/catch Hợp lý. Chúng ta có thể đạt được điều này bằng cách tạo một thư mục mới trong thư mục dự án có tên utils, và trong đó, tạo một tệp có tên tryCatch.js.

Để trừu tượng hóa try-catch logic – chúng ta có thể định nghĩa một chức năng chấp nhận một chức năng khác (được gọi là điều khiển) làm tham số của nó và trả về một async chức năng sẽ giữ một try/catch cho bất kỳ bộ điều khiển nhận được.

Nếu một lỗi xảy ra trong bộ điều khiển, nó sẽ bị bắt trong catch khối và chức năng tiếp theo được gọi là:


const tryCatch = (controller) => async (req, res, next) => {
	try {
		await controller(req, res);
	} catch (error) {
		return next(error);
	}
};
module.exports = tryCatch;

Với try/catch trừu tượng, chúng ta có thể cấu trúc lại mã của mình để làm cho nó ngắn gọn hơn bằng cách bỏ qua try-catch mệnh đề một cách rõ ràng khi tìm nạp người dùng trong app.js:


const getUser = () => undefined;

app.get(
	"/get-user",
	tryCatch(async (req, res) => {
		const user = getUser();
		if (!user) {
			throw new Error("User not found");
		}
		res.status(400).send(error.message);
	})
);

Chúng tôi đã trừu tượng hóa thành công logic thử bắt và mã của chúng tôi vẫn hoạt động như trước đây.

Xử lý lỗi xác thực trong Express

Đối với bản demo này, chúng tôi sẽ tạo một tuyến đường mới trong ứng dụng Express để đăng nhập – để xác thực ID người dùng khi đăng nhập. Trước tiên, chúng tôi sẽ cài đặt joi gói, để giúp tạo một lược đồ, nhờ đó chúng tôi có thể thực thi các yêu cầu:

$ npm i joi

Tiếp theo, tạo một lược đồ là một Joi.object với một userId phải là một số và bắt buộc – nghĩa là yêu cầu phải khớp với một đối tượng có ID người dùng trên đó.

Chúng ta có thể sử dụng validate() phương thức trong đối tượng lược đồ để xác thực mọi đầu vào đối với lược đồ:


const schema = Joi.object({
	userId: Joi.number().required(),
});

app.post(
	"/login",
	tryCatch(async (req, res) => {
		const {error, value} = schema.validate({});
		if (error) throw error;
	})
);

Nếu một đối tượng rỗng được truyền vào validate() phương pháp, lỗi sẽ được xử lý một cách duyên dáng và thông báo lỗi sẽ được gửi tới máy khách:

Trên bảng điều khiển, chúng tôi cũng có quyền truy cập vào một details mảng bao gồm các chi tiết khác nhau về lỗi có thể được thông báo cho người dùng nếu cần.

Để xử lý cụ thể các lỗi xác thực theo cách chuyển chi tiết lỗi thích hợp cho mỗi lỗi xác thực, phần mềm trung gian xử lý lỗi có thể được cấu trúc lại:


const errorHandler = (error, req, res, next) => {
	console.log(error); 

	if (error.name === "ValidationError") {
		return res.status(400).send({
			type: "ValidationError",
			details: error.details,
		});
	}

	res.status(400).send(error.message); 
};

module.exports = errorHandler;

Với errorHandler.js hiện đã được tùy chỉnh, khi chúng tôi thực hiện cùng một yêu cầu với một đối tượng trống được chuyển đến validate() phương pháp:

Hướng dẫn Xử lý ngoại lệ trong Express PlatoBlockchain Data Intelligence. Tìm kiếm dọc. Ái.

Bây giờ chúng tôi có quyền truy cập vào một đối tượng tùy chỉnh trả về tin nhắn theo cách dễ đọc/thân thiện hơn. Bằng cách này, chúng tôi có thể gửi và xử lý các loại lỗi khác nhau dựa trên loại lỗi xuất hiện.

Kết luận

Trong hướng dẫn này, chúng tôi đã xem xét mọi khía cạnh của việc xử lý lỗi của Express.js, bao gồm cách xử lý mã đồng bộ và không đồng bộ theo mặc định, cách tạo các lớp lỗi của riêng bạn, cách viết các hàm phần mềm trung gian xử lý lỗi tùy chỉnh và cung cấp next với tư cách là người xử lý bắt cuối cùng

Giống như mọi tác vụ hiện có, cũng có những phương pháp hay nhất trong quá trình phát triển bao gồm xử lý lỗi hiệu quả và hôm nay chúng ta đã học được cách có thể xử lý lỗi trong ứng dụng Express một cách mạnh mẽ.

Xử lý lỗi đúng cách không chỉ có nghĩa là giảm thời gian phát triển bằng cách dễ dàng tìm ra lỗi và sai sót mà còn phát triển một cơ sở mã mạnh mẽ cho các ứng dụng quy mô lớn. Trong hướng dẫn này, chúng ta đã thấy cách thiết lập phần mềm trung gian để xử lý các lỗi vận hành. Một số cách khác để cải thiện việc xử lý lỗi bao gồm: không gửi dấu vết ngăn xếp, dừng các quy trình một cách nhẹ nhàng để xử lý các ngoại lệ chưa được phát hiện, cung cấp thông báo lỗi thích hợp, gửi nhật ký lỗi và thiết lập một lớp mở rộng Error lớp học.

Tôi hy vọng các ví dụ tôi sử dụng trong hướng dẫn này sẽ thú vị đối với bạn. Tôi đã đề cập đến các tình huống khác nhau mà bạn có thể gặp phải khi viết ứng dụng Express để sử dụng trong thế giới thực về quản lý lỗi. Xin vui lòng, cho tôi biết nếu có bất cứ điều gì tôi bỏ lỡ. Nó sẽ có lợi cho chúng tôi và cũng giúp tôi học hỏi thêm. Chúc một ngày tốt lành và cảm ơn vì đã đọc.

Bạn có thể tham khảo tất cả các mã nguồn được sử dụng trong bài viết trên Github.

Tài Nguyên Bổ Sung

Dấu thời gian:

Thêm từ xếp chồng lên nhau