代码之家  ›  专栏  ›  技术社区  ›  Fred Mériot

GraphQL:用接口管理突变的最佳方法?

  •  5
  • Fred Mériot  · 技术社区  · 7 年前

    I'm new to GraphQL,但我真的很喜欢它。现在,我正在玩接口和联合,我面临着一个突变的问题。

    假设我有以下模式:

    interface FoodType {
      id: String
      type: String
    }
    
    type Pizza implements FoodType {
      id: String
      type: String
      pizzaType: String
      toppings: [String]
      size: String
    }
    
    type Salad implements FoodType {
      id: String
      type: String
      vegetarian: Boolean
      dressing: Boolean
    }
    
    type BasicFood implements FoodType {
      id: String
      type: String
    }
    

    现在,我想创造新的食物,所以我开始做这样的事情:

    type Mutation {
        addPizza(input:Pizza):FoodType
        addSalad(input:Salad):FoodType
        addBasic(input:BasicFood):FoodType
    }
    

    这不起作用,原因有二:

    1. 如果我想传递一个对象作为参数,这个对象必须是“输入”类型。但“披萨”、“沙拉”和“基本食品”只是“类型”。
    2. 输入类型无法实现接口。

    所以,我的问题是:如何在这个接口上下文中处理突变,而不必重复太多类型?我希望避免查询使用Pizza类型,而突变使用InputPizza类型。

    谢谢你的帮助。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Andrew Ingram    7 年前

    输入和输出类型本质上是不同的,只是因为您可能有一种类型恰好代表一个相似的对象(例如 Pizza PizzaInput ),这是一个错误的等价。

    假设在您的模式中 披萨 具有强制id字段(您的id不是强制的,但可能应该是)。这可能对 比萨输入 要有一个ID字段——它将由服务器生成。我想说的是,除了最简单的系统之外,在任何系统中都会有将用户输入转换为完整对象以返回的处理。

    你只要咬紧牙关,做一些感觉像是重复的工作,你就会看到长期的好处。