GraphQL 错误处理的最佳实践:三种常见错误及其解决方法

GraphQL 是一种用于 API 开发的查询语言和运行时环境。虽然 GraphQL 有很多优点,但在开发过程中还是会出现一些错误,需要进行处理。在本文中,我们将介绍三种常见的 GraphQL 错误和解决方法,帮助你更好地处理 GraphQL 错误。

1. 未处理的错误

未处理的错误是指当 GraphQL API 执行查询时,由于异常情况发生,导致请求失败并返回错误信息。这种错误通常是由于无效的查询参数、无效的身份验证令牌或其他未处理的异常情况引起的。

解决方法是通过 try-catch 语句来处理 GraphQL 查询中的异常,并向客户端返回有意义的错误信息。

async function getData(args) {
  try {
    const result = await graphql(schema, query, rootValue, context, variables)
    return result
  } catch (e) {
    return {
      error: {
        message: e.message
      }
    }
  }
}

在上面的代码中,我们利用 async-await 语法执行 GraphQL 查询。如果执行失败,我们通过 catch 块返回一个包含错误消息的对象。客户端可以使用该错误消息来确定下一步的操作。

2. 未找到的对象和类型

GraphQL 查询中常常涉及到对象和类型。如果一个查询中包含了不存在的对象或类型,那么 GraphQL 会抛出错误。

解决方法是在定义 GraphQL schema 时,明确表示出对象和类型的关系。例如:

const schema = buildSchema(`
  type Query {
    getUser(id: Int!): User
  }

  type User {
    id: Int!
    name: String!
    email: String!
  }
`)

在上面的代码中,我们明确定义了查询操作 getUser 返回类型为 User,而且 User 类型明确包含了 id、name 和 email 字段。

3. 并发查询导致的性能问题

GraphQL 允许客户端一次查询多个操作。在并发查询时,若查询操作返回大量数据,会导致 GraphQL API 性能下降。这种情况下,服务器可能会收到大量返回数据的请求,从而导致延迟和性能下降。

解决方法是在服务器端设置数据缓存和较短的超时时间。缓存可以加速数据访问,而短时间的超时能够有效防止客户端非常消耗资源的操作,并防止服务器被锁死。例如:

const apolloServer = new ApolloServer({
  schema,
  dataSources,
  cache: new RedisCache({
    host: 'localhost',
    port: 6379
  }),
  plugins: [
    responseCachePlugin({
      rules: [
        {
          //缓存所有类型为Query且字段名为getUser的请求响应结果,有效期为1分钟
          cacheKey: (request) => JSON.stringify(request.query) + JSON.stringify(request.variables),
          shouldCache: (response) => response.errors == null,
          ttl: 60
        },
      ],
    }),
    ApolloServerPluginLandingPageGraphQLPlayground()
  ],
});

在上面的代码中,我们使用了 RedisCache 来实现缓存,并设置了针对查询 getUser 的缓存规则和有效期,有效期为 1 分钟。

总结

通过本文的介绍,我们了解了三种常见的 GraphQL 错误和解决方法。重要的是要意识到,在处理 GraphQL 查询时,及时捕获异常和错误,对于提高 GraphQL API 的健壮性和可扩展性非常重要。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6596a2f5eb4cecbf2da6d93e


纠错反馈