首页 文章

如何在GraphQL中包含变异请求元数据?

提问于
浏览
1

我正在从头开始构建一个带有API后端的GraphQL服务器,取代了REST API服务器 . 目前,现有API服务器中的一些请求(主要是GraphQL中的突变的创建/更新请求)包括客户端使用的请求ID . 此请求标识是关于请求本身不是域资源的一部分的元数据 .

我的问题是如何在GraphQL查询和突变中建模/包含请求元数据?到目前为止,我唯一的解决方案是创建一个请求类型,其他类型可以包含为一个字段,以便请求数据可以包含在突变返回类型中 . 但是我不喜欢这种方法,因为它将请求数据混合到我的域类型中,这非常违背了GraphQL的精神 . 是否有一种可接受的方式来传递'任意',例如GraphQL中查询或变异响应中的非域类型数据?

示例 - 我想避免的内容:

type UserType {
  id: ID
  name: String
  request: RequestType // mixing request data in with domain type of User
}

type RequestType {
  id: ID
}

更新

对于对此问题感兴趣的其他人,根据这里的回答,我已经确定GraphQL extensions 键是将任意数据添加到GraphQL响应而不将数据成为数据Graph的一部分的好选择 . 在Express-GraphQL中,可以在此处找到有关向响应添加扩展键的文档:https://github.com/graphql/express-graphql#providing-extensions . 这里有一个很好的扩展概述:https://marmelab.com/blog/2017/09/06/dive-into-graphql-part-iii-building-a-graphql-server-with-nodejs.html#server-logging

也就是说,如果请求元数据在概念上是域数据的一部分,那么遵循Kashif关于创建嵌入域类型的ResponseType的建议可能是正确的方法 .

2 回答

  • 0

    由于GraphQL被设计为与协议无关,因此您应该使用所选协议的元数据模式 . 如果您使用的是HTTP,则应传递标头 . 如果您正在使用WS / STOMP / MQTT / AMQP,则可以在每个帧中包含元数据 .

    或者GraphQL有一个extensions protocol . 您可以在扩展对象中为响应添加 request-id . Apollo使用扩展来进行缓存,遥测等 .

    我们已经在 生产环境 中使用GraphQL大约一年了,我们错误地将元数据添加到GraphQL中并且很难管理 . 不要失去您正在使用的协议功能带来的好处 .

  • 0

    这种元元素通常在每个请求的HEADERS中传递 . 然后您可以根据需要处理GraphQL服务器中的那些

    例如 .

    //Request Headers
    ...
    
    X-Request-Id: <Your_Request_Id>
    
    ...
    

    更新

    Headers 可以双向工作,因此在客户端上使用 Headers 也不会有任何问题 . 根据需要将它们从响应中拉出来 .

    但是,如果您真的想在您的变异响应中使用requestId,那么它就是您域中的一部分 . 拥有自定义响应类型没有任何问题,许多现有的GraphQL apis都有自定义响应类型,如 LoginResponseRegisterResponse ,然后包裹您的域对象,但也包含 meta 字段中的额外内容

相关问题