如何在 GraphQL 中使用可选参数实现突变?
Posted
技术标签:
【中文标题】如何在 GraphQL 中使用可选参数实现突变?【英文标题】:How to implement mutations with optional arguments in GraphQL? 【发布时间】:2020-01-02 08:18:04 【问题描述】:我正在学习 graphql,并完成了 https://www.howtographql.com/graphql-js/3-a-simple-mutation/ 教程,并对 updateLink 突变的实现如下所示感兴趣。
type Query
# Fetch a single link by its `id`
link(id: ID!): Link
type Mutation
# Update a link
updateLink(id: ID!, url: String, description: String): Link
我问这个的原因是我见过的所有其他突变实现都只使用非可选参数。我很好奇是否存在社区同意的模式,用于从给定的上下文中仅提取和应用提供的非空参数(url、描述)并将它们应用于相关的数据库记录。
我考虑过如下检查每个变量是否为空,但与 Graphql 提供的其他“魔法”和简单性相比,这种方法看起来比我预期的要混乱。
updateLink(root, args, context)
if (args.url == null && args.description == null)
return null
else if (args.url == null)
return context.prisma.updateLink(
id: args.id,
description: args.description
)
else
return context.prisma.updateLink(
id: args.id,
url: args.url
)
如果您找到了一种更简洁的方法来提取和应用可选参数(url、描述),请告诉我。
我的另一个考虑是如下进行两个单独的更新突变。
type Query
# Fetch a single link by its `id`
link(id: ID!): Link
type Mutation
# Update a link
updateLinkURL(id: ID!, url: String!): Link
updateLinkDescription(id: ID!, description: String!): Link
这里的想法是使用有限的参数和声明性突变名称,可以强制参数为 Non-Null。这里的主要问题是对于包含许多列的表可以有多种更新方法,这也会开始看起来很乱。
仅供参考,我使用 prisma 作为我的 ORM。
【问题讨论】:
【参考方案1】:const resolvers =
Query:
info: () => `This is the API of a Hackernews Clone`,
feed: () => links,
link: (parent, args) =>
// console.log(args)
return links.find((link) => link.id === args.id)
,
Link:
id: (parent) => parent.id,
description: (parent) => parent.description,
url: (parent) => parent.url,
,
【讨论】:
正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。以上是关于如何在 GraphQL 中使用可选参数实现突变?的主要内容,如果未能解决你的问题,请参考以下文章
在 type-graphql 突变中传递多个参数以及 `GraphQLUpload`