node.js - 如何在 fastify 中进行错误处理
问题描述
我正在使用 fastify 为一个工作项目创建一个 rest api,我已经深入到项目中,我开始在我的项目中找出错误处理。但是,我似乎无法理解如何在 fastify 中正确实现错误处理。例如,如何更改默认错误消息的结构?我已经看到了一些使用自定义响应架构布局的示例,但它是用于更改响应的结构还是纯粹用于响应验证?此外,我还看到了在定义自定义错误时抛出错误对象的示例,但我也看到了在抛出错误时使用请求对象之外的函数的示例。什么' 两种引发自定义错误的方法之间的区别是什么?任何有关如何处理此问题的建议表示赞赏。
解决方案
默认情况下,当错误被抛出到 setErrorHandler 方法时,fastify 可以处理错误。在这些情况下,setErrorHandler 具有 error 属性,并且 error 属性需要 statusCode、message 属性。所以我设法扩展了 Error 属性来使用它。您可以查看以下代码以使您清楚
class ApiError extends Error {
constructor(statusCode, message) {
super(message);
this.statusCode = statusCode;
Error.captureStackTrace(this, this.constructor);
}
}
我们可以像中一样使用 ApiError
const product = await Product.findOne({ _id: productId });
if (!product) {
throw new ApiError(httpStatus.NOT_FOUND, 'Product not found');
}
因此,当抛出 unHandled Promise 错误时,setErrorHandler 方法将发送我们在 ApiError 中定义的自定义 http-status 代码和消息
如果您抛出带有消息的默认错误
throw new Error('Product not found');
像这些错误处理程序将返回 500 的状态代码(内部服务器错误)并带有“出现问题”的消息
要了解有关 setErrorHandler 方法的更多信息,您可以参考官方文档https://www.fastify.io/docs/latest/Reference/Server/#seterrorhandler
推荐阅读
- php - 在 PHP 中保存和恢复一个类作为一种优化技术?
- ios - 对于每行有两个卡片单元的 UI,哪种布局更好?
- java - 不能用Hibernate调用PostgreSQL的11个存储过程
- javascript - 无法使用 selenium webdriver(Java)单击“确认电子邮件”链接
- angular - 是否可以通过一些修改在另一个组件中使用一个组件
- php - 1类中的多个sql语句
- apache - Apache 2.4 + Windows XP 上的多个 PHP,带有一个核心 API
- android-studio - 如何与签名的 apk 一起构建调试 apk
- android - TimePicker.OnTimeChangedListener() 无需任何更改即可触发
- html - 尽管位于同一域中,但 iframe 未通过 HTTPS 集成(与 stripe )