在开发 Express.js 应用程序时,错误处理是非常重要的一部分。错误可能会发生在任何地方,例如路由处理程序、中间件、数据库操作和模板渲染等过程中。如果不正确地处理这些错误,可能会导致应用程序崩溃或泄露敏感信息。
本文将介绍一些处理错误的最佳实践,以帮助您编写更健壮、更可靠的 Express.js 应用程序。
错误处理中间件
为了捕获应用程序中的所有错误,您应该编写一个全局的错误处理中间件。这个中间件应该位于所有其他中间件的下方,以确保它能够捕获到所有未处理的错误。
下面是一个示例错误处理中间件:
app.use((err, req, res, next) => { console.error(err.stack); res.status(500).send('Something broke!'); });
在这个示例中,如果范围内的任何其他中间件或路由处理程序引发错误,就会调用这个错误处理中间件。它记录错误堆栈并向客户端发送一个 500 状态。
请注意,错误处理中间件必须采用四个参数(即 err
、req
、res
和 next
),并放在所有其他中间件的下方。
运行时错误 vs. 程序错误
在错误处理中,将错误分为两类:运行时错误和程序错误。
运行时错误是由代码本身引起的错误,例如访问未定义的变量或尝试调用未定义的函数。如果应用程序发生运行时错误,您应该及时修复代码中的错误。
程序错误是指应用程序已正确执行,但由于意外情况导致了错误,例如无法连接到数据库或传递了无效的请求参数等。如果应用程序发生程序错误,您可以将这些错误视为来自和应用程序无关的外部因素,并根据情况展现其他反应,例如托管一个自定义错误页面,或重试某些操作。
记录错误
记录错误是考虑错误处理的另一个方面。当您的应用程序出现错误时,您需要记录错误信息,以便后续分析和调试。
Express.js 没有内置的记录错误机制,但是您可以使用各种日志库,例如 winston、morgan 或 debug 等。
下面是一个使用 morgan 记录错误的示例:
const morgan = require('morgan'); const fs = require('fs'); const accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' }); app.use(morgan('combined', { stream: accessLogStream }));
在这个示例中,我们使用 morgan 记录了所有请求和响应的详细信息,包括响应时间和错误信息,并将其记录到一个名为 access.log
的文件中。
可读性和结构性代码
编写易于阅读和理解的错误处理代码是非常重要的。以下是一些建议:
- 提供明确的错误消息和状态代码,以便客户端和其他开发人员理解错误。
- 使用语义化的错误变量名和中间件函数名。
- 尽量减少代码的嵌套层数。对于过于复杂的处理逻辑,请考虑将它们转换为自定义模块或中间件。
- 使用 ES6 功能,例如箭头函数和模板文字,以提高代码可读性。
下面是一个示例错误处理代码,其中应用了这些建议:
-- -------------------- ---- ------- ------------- ---- ---- ----- -- - ----- ----- - - -------- ------------ ------- ---------- -- ---- ------ --------- -- --------------------------- ---------------------------------------- - ----- --- ---
在这个示例中,我们使用一个对象来存储错误消息、状态代码和堆栈跟踪信息,并将其发送到自定义错误视图中。
结论
在本文中,我们提供了几个处理错误的最佳实践,包括使用错误处理中间件、记录错误、区分运行时错误和程序错误,以及编写易于阅读和理解的代码。
我们希望这些建议能帮助您编写更健壮、更可靠的 Express.js 应用程序,并提高您的开发效率。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/673806cb317fbffedf0dc65c