【问题标题】:Is it possible to not return any data when using a GraphQL mutation?使用 GraphQL 突变时是否可以不返回任何数据?
【发布时间】:2017-11-27 22:55:27
【问题描述】:

我有几个 GraphQL 查询和突变,现在我正在尝试实现 delete 突变而不返回任何数据:

    type Mutation{
        addElement(element: ElementData): ID
        removeElement(id: ID): ¿?
    }

但是,删除操作似乎需要返回值。有没有办法在 GraphQL 中执行“空”响应?如果可能,我想避免返回布尔值或状态标志之类的事情。

我不确定 GraphQL 删除操作的最佳做​​法是什么。

【问题讨论】:

    标签: graphql


    【解决方案1】:

    根据这个Github issue,你不能返回任何东西。

    您可以定义一个可以为空的返回类型,例如

    type Mutation {
      addElement(element: ElementData): ID
      removeElement(id: ID): Boolean
    }

    但我建议您返回已删除元素的 id,因为如果您想使用缓存存储,则必须在删除突变成功运行时更新存储。

    【讨论】:

    • 如果删除,您最好按照建议返回产品 ID(因为它是 graphql,甚至可能是整个产品)。但是,有些操作确实不需要数据。对于这些情况,可以定义type Void,然后使用someOperation(input: InputObject!): Void 来清楚地表明意图。
    【解决方案2】:

    (A) 解决方案graphql-scalars

    原答案如下。

    这是graphql-scalars 库的另一种解决方案:

    1. 安装npm install graphql-scalars,然后
    2. 导入他们的Void 类型:https://www.graphql-scalars.dev/docs/scalars/void

    (B) 使用自定义scalar 的解决方案

    注意:带有void-result from mutation 的设计与"GQL best practices"

    此示例是为 NodeJS Apollo 框架编写的,但很容易将实现转换为您的语言/框架

    我很确定:有一个名为 graphql-void 的 NPM 包,但如果您不想添加另一个依赖项,只需复制此代码即可。

    1。在你的架构中定义Void-scalar

    # file: ./schema.gql
    
    scalar Void
    

    2。实现解析器

    // file ./scalar-void.js
    
    import { GraphQLScalarType } from 'graphql'
    
    const Void = new GraphQLScalarType({
        name: 'Void',
    
        description: 'Represents NULL values',
    
        serialize() {
            return null
        },
    
        parseValue() {
            return null
        },
    
        parseLiteral() {
            return null
        }
    })
    export Void
    

    3。将解析器添加到 ApolloServer

    Void 解析器添加到您的 Apollo 服务器实例的选项中:

    # file: ./server.js
    
    import { ApolloServer } from 'apollo-server-express'
    import { Void } from './scalar-void'
    
    const server = new ApolloServer({
        typeDefs,  // use your schema
        resolvers: {
            Void: Void,
            // ... your resolvers
        },
        
    })
    

    4。在架构中使用 Void 进行突变

    最后,在您的架构中使用新的scalar

    # file: ./schema.gql
    
    type Mutation{
        addElement(element: ElementData): ID
        removeElement(id: ID): Void
    }
    

    【讨论】:

    • 您建议链接的“GQL 最佳实践”的哪一部分是说返回无效的突变是不好的做法?我找不到任何此类建议。
    • @MEMark graphql-rules.com/rules/mutation-payload“每个突变都应该有一个唯一的有效负载类型”。我将更新答案中的链接
    【解决方案3】:

    如果你使用 TypeScript 和 graphql-codegen:

    • 在 GraphQL 架构中:

      scalar Void
      
      type Mutation {
        removeElement(id: ID): Void
      }
      
    • 在解析器的代码生成配置中:

      config:
        scalars:
          Void: "void"
      

    使用此配置,TypeScript 将确保 removeElement 突变解析器不会返回任何内容。在 GraphQL 端,突变的返回值将始终为 null

    【讨论】:

      【解决方案4】:

      查看graphql-scalars Void。这是我所有 GraphQL 项目的标准样板。

      npm i graphql-scalars 
      

      【讨论】:

        猜你喜欢
        • 2019-06-20
        • 2018-06-06
        • 1970-01-01
        • 2019-07-05
        • 2020-05-06
        • 2019-06-28
        • 2020-12-22
        • 2018-06-18
        • 2020-02-25
        相关资源
        最近更新 更多