Apollo GraphQL 错误处理

Posted

技术标签:

【中文标题】Apollo GraphQL 错误处理【英文标题】:Apollo GraphQL error handling 【发布时间】:2017-06-23 00:00:13 【问题描述】:

我正在使用 apollographql/graphql-server。服务器响应如下所示:

"data":...,"errors":["message":"...","locations":...]

我有两个问题:

    我发现我可以抛出或返回一个错误对象,它会被推送到响应的错误数组中,但是一旦我这样做就会发送响应。如何返回多个错误?

    errors 数组是否应该仅用于应用程序或服务器错误,例如错误?数据检查和验证错误是否应该放在数据对象中?

提前致谢!

【问题讨论】:

【参考方案1】:

看看这个:https://github.com/thebigredgeek/apollo-errors

来自他们的自述文件:

创建一些错误:

import  createError  from 'apollo-errors';

export const FooError = createError('FooError', 
  message: 'A foo error has occurred'
);

连接格式:

import express from 'express';
import bodyParser from 'body-parser';
import  formatError  from 'apollo-errors';
import  graphqlExpress  from 'apollo-server-express';
import schema from './schema';

const app = express();

app.use('/graphql',
  bodyParser.json(),
  graphqlExpress(
    formatError,
    schema
  )
);

app.listen(8080)

抛出一些错误:

import  FooError  from './errors';

const resolverThatThrowsError = (root, params, context) => 
  throw new FooError(
    data: 
      something: 'important'
    
  );

【讨论】:

【参考方案2】:

    如果您需要为响应返回多个错误,您很可能需要自己构建一组错误,然后在准备好后返回 graphql 错误。我在我的代码中做了类似的事情。虽然大多数时候,如果我遇到错误,我还是想把它停在那里,并将问题返回给客户。

    对于您而言,典型的“快乐路径”之外的任何内容都是您想要返回错误的 graphql 错误。您的客户端代码将依赖该数据,因此您希望您的客户端能够响应服务器上发生的意外问题。已解析或空的结果集是唯一正常传回且不会出错的内容。其他任何事情,缺少参数、数据库错误等,您都会想要返回错误。

希望对您有所帮助! :)

【讨论】:

感谢您的回答。 1)我之前尝试用字符串数组抛出或返回错误数组或错误,但没有运气。你知道怎么做吗? 2)在正常程序下,我将捕获的错误放在数据对象中,因为来自服务器响应的错误数组似乎不适合表单验证等错误 嗨詹姆斯,我看到同样的事情并试图深入了解它,我无法弄清楚如何抛出多个错误,所以我的错误以数组的形式返回似乎是有点无意义....你有没有找到答案???

以上是关于Apollo GraphQL 错误处理的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 React-Apollo 处理 GraphQL 错误?

如何使用 apollo 客户端在 graphql 的角度处理错误?

全局处理 apollo graphql 错误并在错误时呈现自定义 ErrorHandler 组件

使用 React 钩子处理 graphQL 突变错误(useMutation + Apollo-client)

使用 ApolloClient 和 Apollo-Server-Express 处理 GraphQL 错误

使用 express-graphql 和 react-apollo 处理错误