graphql-api例子中的ErrorsInterceptor捕获异常并返回简单异常信息
pujianjun opened this issue · comments
您好!请问异常过滤器ExceptionFilter只能用于过滤Controller的异常吗?我的服务是Graphql api这种,没有用controller,写了ExceptionFilter没作用。我看您例子graphql api里用了拦截器ErrorsInterceptor,有异常的话return Promise.resolve({
code: 500,
message: 出现了意外错误:${error.toString()}
});
但是我照这样写,在sayHello方法里故意抛出一个HttpException异常,客户端调用Query.sayHello方法时,收到的却是code为INTERNAL_SERVER_ERROR的异常,消息是"Expected Iterable, but did not find one for field Query.sayHello.",还包含其他stacktrace等信息,不是我想要的那种简单异常信息,请问是我用法不对吗?
@pujianjun 这个是因为在拦截器里把返回值修改成了 { code: xxx, message: xxx }
这种结构,而 sayHello
接口只是返回了 String
类型,所以不是预期的结果,你想要把异常信息修改成你预期的,那你所有的 graphql 接口都必须是统一的结构,类似:{ code: xxx, message: xxx, data: xxx }
这种。
GraphQL 也有格式化返回值和异常的方法(formatResponse
和 formatError
),但是我觉得这种不太好用,你可以根据你的情况看看要不要使用:
GraphQLModule.forRoot({
typePaths: ['./**/*.graphql'],
installSubscriptionHandlers: true,
formatResponse: (res, req) => {
return res;
},
formatError: err => {
return err;
}
})