在我们构建一个 Node.js 应用时,出错是不可避免的事情。针对这种情况,Express.js 提供了一系列的错误处理机制。这篇文章将介绍 Express.js 中的错误处理机制,并提供一些最佳实践和示例代码,以帮助大家更好地处理和避免错误。
前置知识
在继续阅读本文前,你应该掌握以下知识:
- 基本的 JavaScript 编程知识
- Node.js 的基础概念
- Express.js 的基本用法
错误处理机制
在 Express.js 中,错误按照一定的优先级被处理。当一个错误发生时,它会通过函数调用链(middleware chain)一直向下传递,直到被处理。这个过程是自动完成的,无需手动干预。
当错误被传递到请求处理中间件(request handling middleware)时,可以通过抛出异常(throw)来跳过所有的其他中间件,进而由错误处理中间件(error handling middleware)处理这个错误。这个错误处理中间件需要设置为以下形式:
app.use(function(err, req, res, next) { // do something });
其中,err 表示错误对象,req 表示请求对象,res 表示响应对象,next 为用于调用下一个中间件的函数。如果你忘记添加这个中间件,那么当出现错误时,Express.js 会默认输出报错信息并结束请求。
最佳实践
1. 使用 try/catch 来捕获错误
虽然一个错误会自动向下传递,但是有些错误需要我们手动处理。例如,当使用异步函数时,我们需要使用 try/catch 来捕获来自回调函数的错误。示例代码如下:
app.get('/', async function(req, res, next) { try { const result = await asyncFunction(); res.send(result); } catch (error) { next(error); } });
在这个示例中,我们使用了异步函数,通过 try/catch 来捕获错误,并将错误传递给下一个中间件(即错误处理中间件)。
2. 将错误分为两类:预期错误和未预期错误
在错误处理中,我们可以将错误分为两类:预期错误和未预期错误。预期错误是我们能够预知并设法避免的错误,例如参数错误、请求超时等等。而未预期错误则是那些我们无法预知并预防的错误,例如数据库崩溃、内存溢出等等。
对于预期错误,我们可以返回一个适当的 HTTP 状态码(如 400、403、404、422)以及一条简要的错误信息。示例代码如下:
-- -------------------- ---- ------- ------------- ------------- ---- ----- - ----- - ---- - - --------- -- ------- - ------ -------------------------- -- ----------- - -- -- --------- ---
对于未预期错误,我们需要记录错误信息,例如保存在日志中,而不是向用户返回错误信息。示例代码如下:
-- -------------------- ---- ------- ------------- ------------- ---- ----- - --- - -- -- --------- ----- ----- ------ -- ---------- ----- - ----- ------- - ----------------- ------ ---------------------------- -------- - -- -- --------- ---
3. 使用第三方库来处理错误
我们可以使用一些第三方库来帮助处理错误,例如 Boom、http-errors 等等。这些库提供了一些常见的错误类型,可以大大减少我们编写错误处理代码的工作量。示例代码如下:
-- -------------------- ---- ------- ----- ---- - ---------------- ------------- ------------- ---- ----- - ----- - ---- - - --------- -- ------- - ------ -------------------------- -- ------------ - -- -- --------- ---
在这个示例中,我们使用了 boom.badRequest
来创建一个“400 Bad Request”错误对象。
结论
错误处理是一个非常重要的话题,能够直接影响应用的可靠性和性能。在 Express.js 中,通过使用错误处理中间件、try/catch、分类错误和第三方库等方式,可以很好地处理和避免错误。希望这篇文章能够对你有所帮助。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/677605bb6d66e0f9aa08e55b