1. Trước hết
Bài viết này trình bày chi tiết cách xử lý lỗi và ngoại lệ một cách an toàn trong ứng dụng Node.js Express. Nó bao gồm các loại lỗi khác nhau, các phương pháp hay nhất về xử lý lỗi và cách xử lý các lỗi và ngoại lệ cụ thể. Đọc bài viết này để hiểu sâu hơn về xử lý lỗi trong Express và tìm hiểu cách tạo các ứng dụng mạnh mẽ và an toàn.
1.1 Các loại lỗi Node.js
Có ba loại lỗi Node.js chính.
Lỗi cú pháp: Xảy ra khi mã không đúng về mặt cú pháp. Ví dụ: thiếu dấu ngoặc nhọn hoặc dấu chấm phẩy đặt sai vị trí. Lỗi thời gian chạy: Lỗi xảy ra trong khi mã của bạn đang chạy. Ví dụ: cố gắng truy cập một biến không xác định hoặc gọi một hàm không tồn tại. Lỗi logic: Lỗi trong logic của mã tạo ra kết quả hoặc hành vi không chính xác mặc dù không có lỗi cú pháp hoặc thời gian chạy.
1.2 Xử lý lỗi nhanh
Express là một khung ứng dụng web mạnh mẽ và linh hoạt dành cho Node.js. Nó được thiết kế để xử lý các lỗi và ngoại lệ một cách khéo léo, cho phép các nhà phát triển tạo ra các ứng dụng mạnh mẽ. Express sử dụng các chức năng của phần mềm trung gian để quản lý luồng đối tượng yêu cầu và phản hồi trong ứng dụng của bạn. Các chức năng phần mềm trung gian này cũng có thể được sử dụng để xử lý lỗi, đảm bảo rằng mọi lỗi xảy ra đều được phát hiện và xử lý đúng cách.
2. Thực tiễn tốt nhất để xử lý lỗi trong Express
Trước khi thảo luận về các kỹ thuật xử lý lỗi cụ thể, hãy thảo luận về một số phương pháp hay nhất để xử lý lỗi trong các ứng dụng Express.
2.1 Tập trung phần mềm trung gian xử lý lỗi vào một nơi
Đó là một cách thực hành tốt để tập trung xử lý lỗi trong một chức năng phần mềm trung gian duy nhất. Điều này cho phép bạn quản lý lỗi một cách nhất quán trong ứng dụng của mình. Có mã xử lý lỗi của bạn ở một nơi giúp bảo trì và cập nhật dễ dàng hơn.
2.2 Nhật ký lỗi
Ghi nhật ký lỗi là điều cần thiết để chẩn đoán và khắc phục sự cố trong ứng dụng của bạn. Ghi cả thông báo lỗi và thông tin bổ sung để giúp gỡ lỗi.
2.3 Không tiết lộ thông tin bí mật
Hãy cẩn thận để không làm lộ thông tin nhạy cảm về ứng dụng hoặc máy chủ của bạn khi trả về lỗi cho máy khách. Điều này giúp ngăn chặn các lỗ hổng bảo mật tiềm ẩn. Thay vào đó, hãy cung cấp các thông báo lỗi chung không tiết lộ chi tiết lỗi hoặc hoạt động bên trong ứng dụng của bạn.
2.4 Sử dụng mã trạng thái HTTP thích hợp
Sử dụng mã trạng thái HTTP phù hợp để phản hồi lỗi là rất quan trọng để trình bày thông tin nhất quán và trải nghiệm người dùng tốt. Định cấu hình ứng dụng của bạn để trả về mã trạng thái phù hợp dựa trên loại lỗi.
3. Cách xử lý các lỗi và ngoại lệ cụ thể trong Express
Bây giờ, chúng ta đã đề cập đến các phương pháp hay nhất về xử lý lỗi Express, chúng ta hãy xem xét kỹ hơn cách xử lý các lỗi và ngoại lệ cụ thể.
3.1 Xử lý lỗi 404 Not Found
Lỗi 404 Not Found xảy ra khi không tìm thấy tài nguyên được yêu cầu trên máy chủ. Để xử lý các lỗi này, hãy thêm chức năng phần mềm trung gian vào cuối tuyến đường của bạn để nắm bắt các yêu cầu không khớp với tuyến đường đã xác định của bạn.
1 2 3 4 | app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res <span class="token punctuation">,</span> next</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">status</span> <span class="token punctuation">(</span> <span class="token number">404</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'リソースが見つかりません'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
3.2 Xử lý lỗi cú pháp
Lỗi cú pháp có thể được phát hiện bằng cách thêm chức năng phần mềm trung gian lắng nghe sự kiện SyntaxError.
1 2 3 4 5 6 7 8 | app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">err <span class="token punctuation">,</span> req <span class="token punctuation">,</span> res <span class="token punctuation">,</span> next</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> err <span class="token keyword">instanceof</span> <span class="token class-name">SyntaxError</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">status</span> <span class="token punctuation">(</span> <span class="token number">400</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'不正なリクエスト'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">next</span> <span class="token punctuation">(</span> err <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
3.3 Xử lý lỗi thời gian chạy
Lỗi thời gian chạy có thể được phát hiện bằng cách sử dụng kết hợp các khối thử bắt và các chức năng phần mềm trung gian xử lý lỗi. Khi sử dụng khối try-catch, hãy chuyển lỗi bắt được cho hàm next() để phần mềm trung gian xử lý lỗi xử lý.
1 2 3 4 5 6 7 8 | app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/route'</span> <span class="token punctuation">,</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res <span class="token punctuation">,</span> next</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token comment">// コードをここに書く</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span> err <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">next</span> <span class="token punctuation">(</span> err <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Phần mềm trung gian xử lý lỗi có thể xác định loại lỗi và phản hồi thích hợp.
1 2 3 4 5 6 7 8 | app <span class="token punctuation">.</span> <span class="token function">use</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token parameter">err <span class="token punctuation">,</span> req <span class="token punctuation">,</span> res <span class="token punctuation">,</span> next</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> err <span class="token punctuation">.</span> name <span class="token operator">===</span> <span class="token string">'TypeError'</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">status</span> <span class="token punctuation">(</span> <span class="token number">500</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'サーバーエラー'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">next</span> <span class="token punctuation">(</span> err <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
3.4 Xử lý lỗi logic
Xử lý lỗi logic phụ thuộc vào logic cụ thể của ứng dụng của bạn. Nói chung, nên xác thực dữ liệu đầu vào và xử lý các sự cố do dữ liệu sai gây ra. Ví dụ: thư viện xác thực như Joi có thể được sử dụng để xác thực dữ liệu đầu vào và trả về thông báo lỗi thích hợp cho máy khách.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">const</span> Joi <span class="token operator">=</span> <span class="token function">require</span> <span class="token punctuation">(</span> <span class="token string">'joi'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> schema <span class="token operator">=</span> Joi <span class="token punctuation">.</span> <span class="token function">object</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> name <span class="token operator">:</span> Joi <span class="token punctuation">.</span> <span class="token function">string</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">required</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> age <span class="token operator">:</span> Joi <span class="token punctuation">.</span> <span class="token function">number</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">integer</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">required</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> app <span class="token punctuation">.</span> <span class="token function">post</span> <span class="token punctuation">(</span> <span class="token string">'/route'</span> <span class="token punctuation">,</span> <span class="token keyword">async</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res <span class="token punctuation">,</span> next</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> <span class="token keyword">try</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> validatedData <span class="token operator">=</span> <span class="token keyword">await</span> schema <span class="token punctuation">.</span> <span class="token function">validateAsync</span> <span class="token punctuation">(</span> req <span class="token punctuation">.</span> body <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// コードをここに書く</span> <span class="token punctuation">}</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span> err <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> err <span class="token keyword">instanceof</span> <span class="token class-name">Joi <span class="token punctuation">.</span> ValidationError</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> res <span class="token punctuation">.</span> <span class="token function">status</span> <span class="token punctuation">(</span> <span class="token number">400</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">send</span> <span class="token punctuation">(</span> <span class="token string">'不正なリクエスト'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">next</span> <span class="token punctuation">(</span> err <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
3.5 Xử lý từ chối lời hứa
Việc xử lý từ chối Promise không đúng cách có thể dẫn đến các vấn đề về bảo mật và hành vi không mong muốn. Để xử lý các từ chối Promise một cách duyên dáng, hãy sử dụng phương thức catch() trên Promise hoặc sử dụng async-await và try-catch như trong ví dụ trước. Ngoài ra, bạn có thể nghe sự kiện UnhandledRejection của đối tượng process để nắm bắt các từ chối Promise chưa được xử lý trong ứng dụng của bạn.
1 2 3 4 5 | process <span class="token punctuation">.</span> <span class="token function">on</span> <span class="token punctuation">(</span> <span class="token string">'unhandledRejection'</span> <span class="token punctuation">,</span> <span class="token punctuation">(</span> <span class="token parameter">reason <span class="token punctuation">,</span> promise</span> <span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">error</span> <span class="token punctuation">(</span> <span class="token string">'未処理の拒否:'</span> <span class="token punctuation">,</span> reason <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// ここで追加のアクションを実行できます。たとえば、エラーを記録したり、監視サービスに通知することができます。</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
bản tóm tắt
Việc xử lý an toàn các lỗi và ngoại lệ trong ứng dụng Node.js Express là rất quan trọng để tạo ra các ứng dụng mạnh mẽ và an toàn. Bằng cách làm theo các phương pháp hay nhất chẳng hạn như xử lý lỗi tổng hợp, ghi nhật ký lỗi và sử dụng mã trạng thái HTTP thích hợp, bạn có thể đảm bảo trải nghiệm người dùng và trình bày thông tin nhất quán. Ngoài ra, hiểu cách xử lý các lỗi và ngoại lệ cụ thể, chẳng hạn như 404 Not Found, lỗi cú pháp, lỗi thời gian chạy, lỗi logic và từ chối lời hứa, sẽ giúp bạn xây dựng các ứng dụng an toàn và đáng tin cậy.
Bằng cách áp dụng các kỹ thuật và phương pháp hay nhất được mô tả trong bài viết này, bạn có thể xử lý các lỗi và ngoại lệ trong ứng dụng Node.js Express của mình một cách an toàn, tạo ra các ứng dụng mạnh mẽ và đáng tin cậy hơn.
cuối cùng
Tôi luôn mắc nợ. Tôi hy vọng bạn thích bài viết này và học được một cái gì đó mới.
Hẹn gặp lại các bạn trong bài viết tiếp theo! Nếu bạn thích bài viết này, hãy nhấn “THÍCH” và đăng ký để ủng hộ tôi. Cảm ơn rất nhiều.