如何在 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 中使用可选参数实现突变?的主要内容,如果未能解决你的问题,请参考以下文章

没有参数的 Graphql 突变

在 type-graphql 突变中传递多个参数以及 `GraphQLUpload`

如何在 Python 中验证 GraphQL 突变

Flutter / GraphQL - 以自定义类型为参数的突变

如何从单个反应组件中调用多个 graphql 突变?

如何在没有参数的情况下进行graphql突变? (Vue 阿波罗)