gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:24:22 28 4
gpt4 key购买 nike

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

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 模式中的可空性的文章(Thisthis 是对我有影响的两篇文章)。
据推测,extra字段在不同的解析器中分离,因为您必须做一些额外的工作来获取它们,例如从另一个服务或数据存储请求数据。如果该请求最终失败,架构将类型声明为可为空是很好的,这样其余的用户数据仍然会返回 extra设置为 null 而不是抛出另一个 user由于 extra 数据丢失为 null 并违反架构类型。 Non-null fields mean small failures have an outsized impactthis article很好地详细解释了这个问题。权衡是您的客户端代码需要检查 extra是否为 null,但有人可能会争辩说,这迫使您的客户端代码考虑更优雅地处理可能的失败案例,这是一件好事。
此更改还将解决您自 extra 以来试图解决的原始问题将是生成的 graphql-code-generator 类型中的可选类型,并且您的主用户解析器不需要返回它。

关于typescript - 使用 GraphQL 代码生成器从解析器返回不完整的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64388564/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com