当没有要返回的数据时,GraphQL突变返回类型应该是什么



我有一台Apollo GraphQL服务器,我有一个删除记录的突变。该突变接收资源的UUID,调用REST(Ruby on Rails(API,并且当删除成功时,API仅返回成功的HTTP代码和空正文(204无内容(,当删除不起作用时,返回带有错误消息的HTTP错误代码(404或500,典型的REST删除端点(。

当定义GraphQL突变时,我必须定义突变返回类型。突变返回类型应该是什么?

input QueueInput {
"The queue uuid"
uuid: String!
}

deleteQueue(input: QueueInput!): ????????

我可以使用几种不同类型的返回(Boolean、String…(,但我想知道什么是最佳实践,因为我尝试的返回类型都不正确。我认为重要的是,在调用突变后,在客户端上,如果事情进展顺利(API返回204而不是内容(或发生了一些错误(API返回404或500(,我会有一些关于发生了什么的信息,理想情况下会有一些有关错误的信息。

GraphQL中的字段必须始终具有类型。GraphQL有null的概念,但null本身并不是一种类型——它只是表示缺少值。

GraphQL中没有"void"类型。然而,类型在默认情况下是可以为null的,因此无论字段的类型如何,解析程序都不能返回任何内容,并且字段只会解析为null。所以你可以只做

type Mutation {
deleteQueue(input: QueueInput!): Boolean #or any other type
}

或者,如果您想要一个专门表示null的标量,您可以创建自己的标量。

const { GraphQLScalarType } = require('graphql')
const Void = new GraphQLScalarType({
description: 'Void custom scalar',
name: 'Void',
parseLiteral: (ast) => null,
parseValue: (value) => null,
serialize: (value) => null,
})

然后做

type Mutation {
deleteQueue(input: QueueInput!): Void
}

也就是说,返回东西是常见的做法。对于删除,通常返回已删除的项目或至少返回其ID。这有助于客户端的缓存管理。返回某种变异有效载荷类型以更好地封装客户端错误也变得越来越常见。

你可以在这样的"有效载荷"类型上包括任意数量的字段:

type Mutation {
deleteQueue(input: QueueInput!): DeleteQueuePayload
}
type DeleteQueuePayload {
# the id of the deleted queue
queueId: ID
# the queue itself
queue: Queue
# a status string
status: String
# or a status code
status: Int
# or even an enum
status: Status
# or just include the client error
# with an appropriate code, internationalized message, etc.
error: ClientError
# or an array of errors, if you want to support validation, for example
errors: [ClientError!]!
}

DeleteQueuePayload甚至可以是不同类型的并集,使客户端能够使用__typename来确定突变的结果。

然而,你暴露的信息取决于你的具体需求,你采用的具体模式归根结底是意见。

有关其他讨论和示例,请参阅此处和此处。

我将graphql服务器与prisma一起使用,当删除某些内容时,prisma会返回有关已删除内容的信息。这很好,因为当您从客户端预处理删除并返回有关它的响应时,可以通过更新缓存来帮助您更改ui

最新更新