dzzzzzy / Nestjs-Learning

nestjs 学习教程 :books:,跟我一起学习 nest 框架~ :muscle:

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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 也有格式化返回值和异常的方法(formatResponseformatError),但是我觉得这种不太好用,你可以根据你的情况看看要不要使用:

GraphQLModule.forRoot({
    typePaths: ['./**/*.graphql'],
    installSubscriptionHandlers: true,
    formatResponse: (res, req) => {
        return res;
    },
    formatError: err => {
        return err;
    }
})

@dzzzzzy 谢谢大神!我统一了我 graphql 接口返回结构{ code: xxx, message: xxx, data: xxx } ,异常也按这样结构返回了,十分感谢!