我一直在学习 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/