【问题标题】:GraphQL Operation NameGraphQL 操作名称
【发布时间】:2021-11-23 07:07:21
【问题描述】:

当我在后端(即 Apollo)设置我的 GraphQL 定义时,定义操作名称有什么方法或好处吗?

例如,我有一个更新操作,可以将枚举作为参数:

mutation {
  updateOrder(status: StatusEnum): Order
}

但我认为我可以为每个状态执行特定的命名操作,并将后端解析器连接到每个状态(随后知道“好的,我是取消解析器,我不需要关心一些枚举")。

mutation {
  makeOrderCanceled(): Order
  makeOrderPending(): Order
  makeOrderComplete(): Order
}

resolvers = {
  makeOrderCanceled: () => {
    // don't need to infer the status from a param, in essence could 
    // just hardcode the enum here and prevent the API consumers from 
    // having to know about it.
  }
}

这很好,也许我会这样做。但这省略了操作名称。我读过它对日志记录很有用,并且作为实际 HTTP 请求的一个字段出现。我明白了。但是,如果我作为后端开发人员定义我的类型、查询和突变,我可以做些什么来帮助改进我的架构的意图和建议使用?例如,我能看到的最后一种方法是这样的:

mutation CancelOrder {
  updateOrder(status: "cancel"): Order   # this
  updateOrder(): Order                   # or this like the examples above
}

mutation CompleteOrder {
  updateOrder(status: "complete"): Order  # this
  updateOrder(): Order                    # or this like the examples above
}

问题

  • 能否在后端定义中定义操作名称?
  • 如果上一个问题是肯定的,这样做有什么好处,特别是比较示例 2 和示例 3?

【问题讨论】:

    标签: graphql apollo-server graphql-js


    【解决方案1】:

    不,您不能在后端定义操作名称,因为操作是动态的并且由 API 的使用者创建。我相信你在这里混合概念。无论您决定构建您的架构(updateOrdermakeOrder****),您最终要说的是:

    这是该服务器可以处理的突变,玩得开心!

    您的消费者可以决定发出任意数量的不同查询,例如,我可以很好地决定在一个操作中执行:

    mutation TryToBreakAPI {
       makeOrderCanceled {
         id
       }
       makeOrderPending {
         id
       }
    }
    

    根据 graphql 规范,突变按顺序执行(与并行执行的查询相比),因此它首先调用 makeOrderCanceled 解析器(及其子级),然后调用 makeOrderPending 解析器(和它的孩子)。

    记录操作名称对于启用更轻松的私有 API 调试仍然是一个好主意,因为您可以要求前端工程师编写一个,以便在查询失败时更容易调试它的来源。但这不是灵丹妙药,因此您通常也应该记录完整的查询(如果只是为了捕捉一些可能以意想不到的方式尝试使用您的 API 的潜在恶意行为者)。

    有一些方法可以限制您的服务器可以接受的查询,这通常称为query whitelisting,它的实现将取决于您使用的服务器(老实说,您甚至可以自己构建)。它通常包括对前端使用的每个查询进行 SHA256 处理,并告诉后端只接受散列到“已批准”散列之一的查询。

    【讨论】:

      猜你喜欢
      • 2019-07-18
      • 2022-12-01
      • 2019-09-19
      • 2020-06-30
      • 2020-08-12
      • 1970-01-01
      • 2016-01-28
      • 2011-01-27
      • 1970-01-01
      相关资源
      最近更新 更多