如何实现多个项目的 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
    }
  }
}

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