【问题标题】:graphql: single mutation or one mutation per typegraphql:单个突变或每种类型一个突变
【发布时间】:2022-01-21 01:30:12
【问题描述】:

我有一个这样的 GraphQL 架构:

type User {
 id: ID
 name: String
 email: String
 addresses: [UserAddress] 
}

type UserAddress {
 id: ID
 city: String
 country: String
}

我一直怀疑如何为突变做出最佳设计。 (我用的是阿波罗+棱镜)

这些是我的选择:

1) 单一突变

我需要创建这个突变和输入类型:

input userAddressInput {
 id: ID
 city: String
 country: String
}

mutation updateUser (
 id: ID
 name: String
 email: String
 addresses: UserAddressInput
): User    

然后我像这样执行突变:

mutation updateUserData($id: ID, $name: String, $email: String) {
  updateUser(id: $id, name: $name, email: $email) {      
    id
    name
    email      
  }
}

mutation updateUserAddress($id: ID, $userAddress: UserAddressInput) {
  updateUser(id: $id, userAddress: $userAddress) {      
    id
    addresses {
     id
     city
     country  
    }            
  }
}

像这样的解析器:

Mutation: {
 updateUser: (_, args) => {

  if (args.name || args.email) {
     // update model User by args.userData.id
  }

  if (args.userAddress) {
     // update model UserAddress by args.userAddress.id
  }

 }
}

2) 每种类型一个突变

我不需要创建任何输入类型,但我需要两个突变:

mutation updateUser (
 id: ID
 name: String
 email: String     
): User  

mutation updateUserAddress (
 id: ID
 city: String
 country: String     
): UserAddress  

然后是这样的突变:

mutation updateUser($id: ID, $name: String, $email: String) {
  updateUser(id: $id, name: $name, email: $email) {      
    id
    name
    email      
  }
}

mutation updateUserAddress($id: ID, $city: String, $country: String) {
  updateUserAddress(id: $id, city: $city, country: $country) {      
    id
    city
    country      
  }
}

像这样的解析器:

Mutation: {
 updateUserAddress: (_, args) => {
  // update model UserAddress by args.id
 }
 updateUser: (_, args) => {  
  // update model User by args.id
 } 
}

处理此类情况的最佳方法是什么?

【问题讨论】:

    标签: graphql apollo-server graphql-js prisma-graphql


    【解决方案1】:

    这取决于你的用例是什么。

    您的 GUI 是否允许在不更新用户信息的情况下更新用户地址?如果是这样,您可能需要一个单独的突变来仅更新地址。

    如果您允许编辑用户和地址并将其保存为一个操作,那么单个变更将需要您发送多个 HTTP 请求(每个变更一个)。

    您是否需要将用户和地址更新为原子事务(即全部或全部)?如果是这样,那么您应该使用单个突变。

    【讨论】:

      猜你喜欢
      • 2017-01-21
      • 2019-07-20
      • 2019-11-18
      • 2017-12-20
      • 2017-10-28
      • 2022-01-17
      • 2017-05-05
      • 2019-01-08
      • 2021-02-24
      相关资源
      最近更新 更多