【问题标题】:How to work with error handling in fastify如何在 fastify 中进行错误处理
【发布时间】:2021-12-26 06:11:16
【问题描述】:
我正在使用 fastify 为一个工作项目创建一个 rest api,我已经深入到项目中,我开始弄清楚我的项目中的错误处理。但是,我似乎无法理解如何在 fastify 中正确实现错误处理。例如,如何更改默认错误消息的结构?我已经看到了一些使用自定义响应架构布局的示例,但它是用于更改响应的结构还是纯粹用于响应验证?此外,我还看到了在定义自定义错误时抛出错误对象的示例,但我也看到了在抛出错误时使用请求对象之外的函数的示例。两种抛出自定义错误的方法有什么区别?任何有关如何处理此问题的建议表示赞赏。
【问题讨论】:
标签:
node.js
http
error-handling
fastify
【解决方案1】:
默认情况下,当错误被抛出到 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);
}
}
我们可以像 in 一样使用 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