graphql - 如何实现 GraphQL 对多个项目的错误处理?

标签 graphql graphql-js graphql-java express-graphql prisma-graphql

我一直在学习 GraphQL,现在我正在学习与 GraphQL 中的错误处理相关的内容。我提到了this article用于 GraphQL 中的错误处理。现在,从文章中我了解到,如果我在 GraphQL 中有一个 user 查询,那么我可以创建一个 Union,其中包含所有可能的类型,包括 Error

union UserResult = 用户 |已删除用户 |错误

现在,在该特定解析器中,如果发生任何错误,我将发送错误类型响应,并且我将能够在客户端显示适当的错误。这就是错误处理。

但是如果我有一个查询users,它将返回一个用户数组,该怎么办?假设按照上述方法我将做类似的事情......

type Query {
         users: [UserResult!]!
}

union UserResult = User | DeletedUser | Error

现在,在 users 解析器中,如果发生任何错误,那么我将无法发回单个错误响应。因为,GraphQL 不允许这样的语法...

type Query {
         users: UsersResult!
}

union UserResult = User | DeletedUser | Error
union UsersResult = [UserResult!] | Error

那么,我如何在 GraphQL 中实现此功能?

我期望的回应是......

如果没有出现任何问题...


data: {
    users: [
        { id: '1', username: 'user1', email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="eb9e988e99daab8f8e8684c5888486" rel="noreferrer noopener nofollow">[email protected]</a>' },
        { id: '2', username: 'user2', email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="98edebfdeaaad8fcfdf5f7b6fbf7f5" rel="noreferrer noopener nofollow">[email protected]</a>' },
        { id: '3', username: 'user3', email: '<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="b3c6c0d6c180f3d7d6dedc9dd0dcde" rel="noreferrer noopener nofollow">[email protected]</a>' }
    ]
}

如果从数据库获取数据时出现问题(例如)...

data: {
    error: {
        code: 'ER101',
        message: 'Something went wrong',
    }
}

最佳答案

我会做这样的事情,以保留 article 中解释的好处:

union UserResult = User | DeletedUser | Error

type UserList {
  list: [UserResult!]!
  count: Int
}

union UsersResult = UserList | Error

type Query {
  users: UsersResult!
}

然后您可以像这样处理错误:

query users {
  users {
    ...on UserList {
      count
      list {
        ...on User {
          name
        }
        ...on DeletedUser {
          code
        }
        ...on Error {
          code
        }
      }
    }
    ...on Error {
      code
    }
  }
}

这还取决于您的用例和业务逻辑。

关于graphql - 如何实现 GraphQL 对多个项目的错误处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72210110/

相关文章:

typescript - 如何缩小由 graphQL codegen 自动生成的 Typescript 类型?

reactjs - 如何使用全局ID?

java - ValidationError FieldUndefined SPQR GraphQL

spring - Graphql工具:将实体类型映射到graphql类型

java - 如何将apollographographll客户端实现到Maven项目中以激活订阅?

graphql - 使用GraphQL和Prisma级联删除相关节点

go - 将 echo.Context 转换为 context.Context

react-native - GraphQL DynamoDB 架构中的默认主键?

用于 HTML 结构的 GraphQL 自定义标量类型