繁体   English   中英

graphql:单个突变或每种类型一个突变

[英]graphql: single mutation or one mutation per type

我有一个像这样的 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
 } 
}

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM