如何实现多个项目的 GraphQL 错误处理?
How to achieve GraphQL Error Handling for Multiple Items?
我一直在学习 GraphQL,现在我正在学习与 GraphQL 中的错误处理相关的东西。我在 GraphQL 中提到了 this article 的错误处理。现在,从文章中我了解到,如果我在 GraphQL 中有一个 user
查询,那么我可以创建一个包含所有可能类型的联合,包括 Error
union UserResult = User | DeletedUser | Error
现在,在那个特定的解析器中,如果发生任何错误,我将发送一个错误类型的响应,我将能够在客户端显示适当的错误。这就是错误处理。
但是,如果我有一个查询 users
,它将 return 一组用户。假设按照上述方法我将做类似...
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: 'user1@demo.com' },
{ id: '2', username: 'user2', email: 'user2@demo.com' },
{ id: '3', username: 'user3', email: 'user3@demo.com' }
]
}
如果从数据库中获取数据时出现问题(例如)...
data: {
error: {
code: 'ER101',
message: 'Something went wrong',
}
}
不确定这是否能解决您的问题:
// User type:
user: {
id: string,
username: string,
email: string,
}
// Return type looks like this:
data: {
users: user[] | null, // nullable
error: {
code: string,
message: string,
} | null // nullable
}
// If nothing went wrong:
data: {
users: [
{ id: '1', username: 'user1', email: 'user1@demo.com' },
{ id: '2', username: 'user2', email: 'user2@demo.com' },
{ id: '3', username: 'user3', email: 'user3@demo.com' }
],
error: null,
}
// If something went wrong:
data: {
users: null,
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 中的错误处理相关的东西。我在 GraphQL 中提到了 this article 的错误处理。现在,从文章中我了解到,如果我在 GraphQL 中有一个 user
查询,那么我可以创建一个包含所有可能类型的联合,包括 Error
union UserResult = User | DeletedUser | Error
现在,在那个特定的解析器中,如果发生任何错误,我将发送一个错误类型的响应,我将能够在客户端显示适当的错误。这就是错误处理。
但是,如果我有一个查询 users
,它将 return 一组用户。假设按照上述方法我将做类似...
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: 'user1@demo.com' },
{ id: '2', username: 'user2', email: 'user2@demo.com' },
{ id: '3', username: 'user3', email: 'user3@demo.com' }
]
}
如果从数据库中获取数据时出现问题(例如)...
data: {
error: {
code: 'ER101',
message: 'Something went wrong',
}
}
不确定这是否能解决您的问题:
// User type:
user: {
id: string,
username: string,
email: string,
}
// Return type looks like this:
data: {
users: user[] | null, // nullable
error: {
code: string,
message: string,
} | null // nullable
}
// If nothing went wrong:
data: {
users: [
{ id: '1', username: 'user1', email: 'user1@demo.com' },
{ id: '2', username: 'user2', email: 'user2@demo.com' },
{ id: '3', username: 'user3', email: 'user3@demo.com' }
],
error: null,
}
// If something went wrong:
data: {
users: null,
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
}
}
}
这也取决于您的用例和业务逻辑。