在开发 Express.js 应用程序时,错误处理一直是一个重要的问题。错误可能是由于许多原因引起的,例如代码错误、网络问题、数据库连接失败等。如果我们不处理这些错误,我们的应用程序可能会崩溃或无法正常工作。因此,我们需要一些自动恢复错误的最佳实践,以确保我们的应用程序始终保持可靠性。
异常处理
在 Express.js 中,我们可以使用 try-catch 块来捕获异常。这是一种非常基本的错误处理方法,但它确实可以解决一些问题。例如,如果我们在处理请求时遇到错误,我们可以使用 try-catch 块来捕获它,并给客户端发送一个错误响应。
app.get('/', (req, res) => { try { // 处理请求 } catch (error) { res.status(500).send('Internal Server Error') } })
但是,这种方法有一个缺点,就是我们必须在每个路由处理程序中都使用 try-catch 块。这会导致代码变得冗长和难以维护。
使用中间件处理错误
为了避免在每个路由处理程序中使用 try-catch 块,我们可以使用 Express.js 的中间件来处理错误。当我们在应用程序中使用中间件时,我们可以将错误处理程序添加到中间件堆栈中,以便在发生错误时自动调用。
app.use((err, req, res, next) => { console.error(err.stack) res.status(500).send('Internal Server Error') })
在上面的代码中,我们创建了一个错误处理中间件,并将其添加到应用程序中。当发生错误时,Express.js 将自动调用这个中间件,并将错误传递给它。在这个中间件中,我们可以记录错误,并向客户端发送一个错误响应。
但是,这种方法仍然有一个问题,就是我们必须在每个中间件中都添加错误处理程序。这会导致代码变得冗长和难以维护。
使用错误处理中间件
为了避免在每个中间件中都添加错误处理程序,我们可以使用错误处理中间件。错误处理中间件是一种特殊的中间件,它只会在发生错误时调用。当我们将错误处理中间件添加到应用程序中时,它将自动处理所有错误,并向客户端发送错误响应。
app.use((err, req, res, next) => { console.error(err.stack) res.status(500).send('Internal Server Error') })
在上面的代码中,我们创建了一个错误处理中间件,并将其添加到应用程序中。当发生错误时,Express.js 将自动调用这个中间件,并将错误传递给它。在这个中间件中,我们可以记录错误,并向客户端发送一个错误响应。
使用错误处理中间件的最佳实践
在使用错误处理中间件时,我们应该遵循一些最佳实践,以确保我们的应用程序始终保持可靠性。
记录错误
当发生错误时,我们应该记录它,以便我们可以了解错误的原因,并在以后解决它。我们可以使用日志库来记录错误,例如 winston 或 bunyan。
-- -------------------- ---- ------- ----- ------- - ------------------ ----- ------ - ---------------------- ------ -------- ----------- - --- ----------------------------- --- ------------------------- --------- ----------- -- - -- ------------- ---- ---- ----- -- - ----------------------- ------------------------------ ------ ------- --
在上面的代码中,我们使用 winston 记录错误,并将错误写入控制台和一个名为 error.log 的文件中。
使用错误代码
当向客户端发送错误响应时,我们应该使用错误代码来标识错误类型。这可以帮助客户端了解错误的原因,并采取正确的措施。我们可以使用 http-errors 库来创建错误对象,并将错误代码添加到它们中。
-- -------------------- ---- ------- ----- ----------- - ---------------------- ------------- ---- ----- -- - ----- --- - ---------------- ---- ------- --------- -- ------------- ---- ---- ----- -- - --------------------- -- ---------------------- --
在上面的代码中,我们使用 http-errors 库创建一个 404 错误,并将其传递给下一个中间件。在错误处理中间件中,我们将错误代码添加到响应中。
避免暴露敏感信息
当向客户端发送错误响应时,我们应该避免暴露敏感信息。例如,我们不应该将数据库连接字符串或其他敏感信息包含在错误响应中。我们可以使用环境变量来存储敏感信息,并在错误处理中间件中避免它们的使用。
app.use((err, req, res, next) => { console.error(err.stack) res.status(500).send('Internal Server Error') }) if (process.env.NODE_ENV === 'production') { process.env.DB_PASSWORD = '********' }
在上面的代码中,我们将数据库密码存储在环境变量中,并在生产环境中隐藏它。
结论
错误处理是一个重要的问题,它可以影响我们的应用程序的可靠性。在 Express.js 中,我们可以使用错误处理中间件来自动处理错误。我们应该遵循一些最佳实践,如记录错误、使用错误代码和避免暴露敏感信息,以确保我们的应用程序始终保持可靠性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676533c576af2b9a20e9cc21