不从GraphqL变异返回数据

ang*_*ala 20 graphql

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

type Mutation{
    addElement(element:ElementData): ID
    removeElement(id:ID): ¿?
}
Run Code Online (Sandbox Code Playgroud)

但是,似乎需要删除操作的返回值.有没有办法在graphql中执行"空"响应?我想避免像可能的情况那样返回布尔值或状态标志.

我不确定Graphql删除操作的最佳实践是什么

Loc*_*0_0 24

在此问题之后,您无法返回任何内容.

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

type Mutation {
  addElement(element: ElementData): ID
  removeElement(id: ID): Boolean
}
Run Code Online (Sandbox Code Playgroud)

但我建议你返回已删除元素的id.

因为如果您想使用缓存存储,则必须在删除突变正向传递时更新存储.

  • 如果删除,最好按照建议返回产品ID(因为它是graphql,甚至可能是整个产品).但是,某些操作确实不需要数据.对于那些情况,可以定义```type Void```然后执行```someOperation(输入:InputObject!):Void```以清楚地表明意图. (15认同)
  • 需要返回值的突变的一个例子是注销,这只会破坏会话。 (2认同)
  • @Sandy,即使发生注销突变,客户端可能仍然想知道操作是否成功(在这种情况下,需要返回值)。真正不需要返回值的突变是 API 开发人员不希望客户端知道其是否成功的突变。我确信有这样的例子,但它们可能并不常见。 (2认同)

max*_*kov 20

自定义解决方案 scalar

注意:带有void-result from mutations 的设计与“GQL 最佳实践”背道而驰

这个例子是为 NodeJS Apollo 框架编写的,但是很容易转换你的语言/框架的实现

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

1.Void在你的模式中定义-scalar

# file: ./schema.gql

scalar Void
Run Code Online (Sandbox Code Playgroud)

2. 实现解析器

# file: ./schema.gql

scalar Void
Run Code Online (Sandbox Code Playgroud)

3. 将解析器添加到 ApolloServer

Void解析器添加到 Apollo Server 实例的选项中:

// 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
Run Code Online (Sandbox Code Playgroud)

4.Void用于您在架构中的更改

最后scalar在您的架构中使用 new :

# file: ./schema.gql

type Mutation{
    addElement(element: ElementData): ID
    removeElement(id: ID): Void
}
Run Code Online (Sandbox Code Playgroud)

  • 您建议链接的“GQL 最佳实践”的哪一部分认为返回 void 的突变是不好的实践?我找不到任何这样的建议。 (6认同)
  • @MEMark https://graphql-rules.com/rules/mutation-payload:_“每个突变都应该有一个唯一的有效负载类型”_。我将更新答案中的链接 (2认同)

Lek*_*sat 5

如果您使用 TypeScript 和graphql-codegen

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