Javascript 在GraphQL中使用查询响应类型的缺点是什么?

Javascript 在GraphQL中使用查询响应类型的缺点是什么?,javascript,graphql,apollo-server,Javascript,Graphql,Apollo Server,在Apollo文档中,它谈到了使用突变响应类型,其中您将返回一个响应,其中包括代码、成功、消息,以及更改的特定数据的键。i、 e.用户 示例: interface MutationResponse { code: String! success: Boolean! message: String! } type UpdateUserMutationResponse implements MutationResponse { code: String! success: Boo

在Apollo文档中,它谈到了使用突变响应类型,其中您将返回一个响应,其中包括
代码
成功
消息
,以及更改的特定数据的键。i、 e.用户

示例

interface MutationResponse {
  code: String!
  success: Boolean!
  message: String!
}
type UpdateUserMutationResponse implements MutationResponse {
  code: String!
  success: Boolean!
  message: String!
  user: User
}
我们已经使用这种方法一段时间了。我们的查询也采用了这种方法,每个查询都有一个查询响应类型

例如,如果找不到用户,响应将向客户端返回适当的详细信息

将我们的微服务中的错误通过管道传递给客户机会使事情分配变得更加混乱和难以解释。我们已经开始修改我们的一个API,使其不使用查询响应类型,处理错误等变得更加复杂


所以我的问题是,除了变异响应类型之外,使用查询响应类型的缺点是什么?我们无法决定是替换查询响应类型还是保留它们。

一个好的起点是查看您预期的每个错误,并询问客户是否关心错误的性质。如果您要进一步验证上游的查询输入,那么将非常具体的错误发送回客户机是完全有意义的。例如,数据库需要将一个值格式化为UUID,但客户端发送的字符串不是——作为客户端,我想知道抛出了哪个字段以及原因。另一方面,如果我们无法连接到微服务或在执行过程中遇到意外错误,作为客户端,我真的不在乎。出现内部服务器错误,可能是我退出并重试,或者提示用户这样做。在我看来,在这些情况下,在
errors
数组中有一个错误就足够了。如果您有很多前者,那么使用响应包装器类型可能是有意义的。另一方面,如果您只有一小部分,您甚至可以使用客户标量通过GraphQL进行验证。这是一个好问题,但它实际上取决于实际使用API的客户机的需要,以及您正在处理或至少预期的错误类型。除了涉及无效输入的错误外,您的团队是否认为还有其他错误应该向客户端公开?@DanielRearden查询响应类型中不会返回诸如无法访问微服务或数据库脱机等内部错误。错误数组中返回内部服务器错误。我们在查询类型中返回的唯一错误/消息是客户机关心的数据。例如,在我的上一个问题中,如果查询请求了一个用户,但未找到该用户,则请求用户不可用(已阻止),等等。查询将返回状态为false,并提供有关原因的详细信息,我们有一个面向公众的web应用程序和一个私有的内部管理系统。两种GraphQL网关都使用响应类型进行突变和查询。过渡到使用errors数组来处理诸如表单丢失或无效等错误,以及您所说的客户机不关心的实际错误,这将是一项相当大的工作。一个好的起点是查看您预期的每个错误,并询问客户机是否关心错误的性质。如果您要进一步验证上游的查询输入,那么将非常具体的错误发送回客户机是完全有意义的。例如,数据库需要将一个值格式化为UUID,但客户端发送的字符串不是——作为客户端,我想知道抛出了哪个字段以及原因。另一方面,如果我们无法连接到微服务或在执行过程中遇到意外错误,作为客户端,我真的不在乎。出现内部服务器错误,可能是我退出并重试,或者提示用户这样做。在我看来,在这些情况下,在
errors
数组中有一个错误就足够了。如果您有很多前者,那么使用响应包装器类型可能是有意义的。另一方面,如果您只有一小部分,您甚至可以使用客户标量通过GraphQL进行验证。这是一个好问题,但它实际上取决于实际使用API的客户机的需要,以及您正在处理或至少预期的错误类型。除了涉及无效输入的错误外,您的团队是否认为还有其他错误应该向客户端公开?@DanielRearden查询响应类型中不会返回诸如无法访问微服务或数据库脱机等内部错误。错误数组中返回内部服务器错误。我们在查询类型中返回的唯一错误/消息是客户机关心的数据。例如,在我的上一个问题中,如果查询请求了一个用户,但未找到该用户,则请求用户不可用(已阻止),等等。查询将返回状态为false,并提供有关原因的详细信息,我们有一个面向公众的web应用程序和一个私有的内部管理系统。两种GraphQL网关都使用响应类型进行突变和查询。对于丢失或无效表单等错误,以及客户机不关心的实际错误,过渡到使用errors数组将是一项相当大的工作。