繁体   English   中英

使用 GraphQL 代码生成器从解析器返回不完整的形状

[英]Return incomplete shapes from resolver with GraphQL Code Generator

我使用以下约定让解析器返回部分数据,并允许其他解析器完成缺失的字段:

type UserExtra {
  name: String!
}

type User {
  id: ID!
  email: String!
  extra: UserExtra!
}

type Query {
  user(id: ID!): User!
  users: [User!]!
}
const getUser = (id: string): { id: string, email: string, extra: { name: string } => fetchUser(id);

// `fetchUsers` only returns `id` and `email`, but not `extra`
const getUsers = (): { id: string, email: string }[] => fetchUsers();

// we can use this function to fetch the extra field for a given user
const getUserExtra = (id: string): { name: string }  => fetchUserExtra();

export default {
  Query: {
    user: (parent, args) => getUser(args.id),
    users: () => getUsers(),
  },
  User: {
    // here we fetch the `extra` field anytime an `User` is requested
    // in real-life I would check if the query is requesting the `extra`
    // field or not, and only fetch the data if requested by the query
    extra: (parent) => {
      return getUserExtra(parent.id)
    },
  }
}

我遇到的问题是 GraphQL 代码生成器生成一个Resolver类型,它期望Query#users返回完整的User形状,当然它不知道即使我从Query#users返回部分形状,谢谢对于User#extra ,客户端最终将收到预期的形状。

在让 TS 满意的同时处理这种情况的最佳方法是什么?

当我有这些类型的场景,我做了extra领域可以为空(更换extra: UserExtra!extra: UserExtra )。 有许多文章告诉我们怎样在你的Graphql架构治疗为空( 是两个人有影响力对我来说)。

据推测, extra字段在不同的解析器中分离,因为您必须做一些额外的工作来获取它们,例如从另一个服务或数据存储请求数据。 如果该请求最终失败,那么架构将类型声明为可为空是很好的,因此其余用户数据仍会返回并extra设置为空,而不是因为extra为空并违反架构而将其他user数据扔掉类型。 Non-null fields mean small failures have an outsized impact这篇文章很好地详细解释了这个问题。 权衡是,那么您的客户端代码需要检查extra是否为 null,但有人可能会争辩说,这迫使您的客户端代码考虑更优雅地处理可能的失败案例,这是一件好事。

此更改还将解决您尝试解决的原始问题,因为extra将是生成的 graphql-code-generator 类型中的可选类型,并且您的主用户解析器不需要返回它。

有一个名为mapper的配置选项。 基本上,您可以指定(覆盖)解析器的返回类型,以更好地匹配代码中的实际返回类型。

实际上 GraphQL 通常允许您在解析器中返回任何类型的数据。 所以这就是为什么我们有映射器来指定它们的类型。

有关更多详细信息https://github.com/dotansimha/graphql-code-generator/discussions/4030

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM