Express.js 中的错误处理机制及最佳实践

阅读时长 4 分钟读完

在我们构建一个 Node.js 应用时,出错是不可避免的事情。针对这种情况,Express.js 提供了一系列的错误处理机制。这篇文章将介绍 Express.js 中的错误处理机制,并提供一些最佳实践和示例代码,以帮助大家更好地处理和避免错误。

前置知识

在继续阅读本文前,你应该掌握以下知识:

  • 基本的 JavaScript 编程知识
  • Node.js 的基础概念
  • Express.js 的基本用法

错误处理机制

在 Express.js 中,错误按照一定的优先级被处理。当一个错误发生时,它会通过函数调用链(middleware chain)一直向下传递,直到被处理。这个过程是自动完成的,无需手动干预。

当错误被传递到请求处理中间件(request handling middleware)时,可以通过抛出异常(throw)来跳过所有的其他中间件,进而由错误处理中间件(error handling middleware)处理这个错误。这个错误处理中间件需要设置为以下形式:

其中,err 表示错误对象,req 表示请求对象,res 表示响应对象,next 为用于调用下一个中间件的函数。如果你忘记添加这个中间件,那么当出现错误时,Express.js 会默认输出报错信息并结束请求。

最佳实践

1. 使用 try/catch 来捕获错误

虽然一个错误会自动向下传递,但是有些错误需要我们手动处理。例如,当使用异步函数时,我们需要使用 try/catch 来捕获来自回调函数的错误。示例代码如下:

在这个示例中,我们使用了异步函数,通过 try/catch 来捕获错误,并将错误传递给下一个中间件(即错误处理中间件)。

2. 将错误分为两类:预期错误和未预期错误

在错误处理中,我们可以将错误分为两类:预期错误和未预期错误。预期错误是我们能够预知并设法避免的错误,例如参数错误、请求超时等等。而未预期错误则是那些我们无法预知并预防的错误,例如数据库崩溃、内存溢出等等。

对于预期错误,我们可以返回一个适当的 HTTP 状态码(如 400、403、404、422)以及一条简要的错误信息。示例代码如下:

-- -------------------- ---- -------
------------- ------------- ---- ----- -
  ----- - ---- - - ---------

  -- ------- -
    ------ -------------------------- -- -----------
  -

  -- -- ---------
---

对于未预期错误,我们需要记录错误信息,例如保存在日志中,而不是向用户返回错误信息。示例代码如下:

-- -------------------- ---- -------
------------- ------------- ---- ----- -
  --- -
    -- -- --------- ----- ----- ------ -- ---------- -----
  - ----- ------- -
    -----------------
    ------ ---------------------------- --------
  -

  -- -- ---------
---

3. 使用第三方库来处理错误

我们可以使用一些第三方库来帮助处理错误,例如 Boomhttp-errors 等等。这些库提供了一些常见的错误类型,可以大大减少我们编写错误处理代码的工作量。示例代码如下:

-- -------------------- ---- -------
----- ---- - ----------------

------------- ------------- ---- ----- -
  ----- - ---- - - ---------

  -- ------- -
    ------ -------------------------- -- ------------
  -

  -- -- ---------
---

在这个示例中,我们使用了 boom.badRequest 来创建一个“400 Bad Request”错误对象。

结论

错误处理是一个非常重要的话题,能够直接影响应用的可靠性和性能。在 Express.js 中,通过使用错误处理中间件、try/catch、分类错误和第三方库等方式,可以很好地处理和避免错误。希望这篇文章能够对你有所帮助。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/677605bb6d66e0f9aa08e55b

纠错
反馈