graphql,当有“add”和“update”突变时如何设计输入类型?

2024-04-15

这是我的要求:

  1. “添加”突变,每个字段(或称为标量)BookInput输入类型应该有额外的类型修饰符“!”验证非空值。这意味着当我添加一本书时,参数必须有title and author场,比如{title: "angular", author: "novaline"}

  2. “更新”突变,我想更新书的一部分字段,不想更新整本书(MongoDB文档,而且,我不希望前端向graphql服务器传递一整本书的突变参数节省带宽)。这意味着这本书的论点可以是{title: "angular"} or {title: "angular", author: "novaline"}.

这是我的类型定义:

const typeDefs = `
  input BookInput {
    title: String!
    author: String!
  }

  type Book {
    id: ID!
    title: String!
    author: String!
  }

  type Query {
    books: [Book!]!
  }

  type Mutation{
    add(book: BookInput!): Book
    update(id: String!, book: BookInput!): Book
  }
`;

目前,“添加”突变效果很好。但是如果我通过了“更新”突变就无法通过非空检查{title: "angular"}争论

这是一个未通过非空检查的突变,缺少“作者”字段BookInput输入类型。

mutation {
  update(id: "1", book: {title: "angular"}) {
    id
    title
    author
  }
}

所以,graphql 会给我一个错误:

{
  "errors": [
    {
      "message": "Field BookInput.author of required type String! was not provided.",
      "locations": [
        {
          "line": 2,
          "column": 24
        }
      ]
    }
  ]
}

我该如何设计BookInput输入类型?不想定义addBookInput and updateBookInput。它是重复的。


一种非常常见的模式是每个突变都有单独的输入类型。您可能还想为每个操作创建一个突变查询。也许是这样的:

const typeDefs = `
  input AddBookInput {
    title: String!
    author: String!
  }

  input UpdateBookInput {
    # NOTE: all fields are optional for the update input 
    title: String
    author: String
  }

  type Book {
    id: ID!
    title: String!
    author: String!
  }

  type Query {
    books: [Book!]!
  }

  type Mutation{
    addBook(input: AddBookInput!): Book
    updateBook(id: String!, input: UpdateBookInput!): Book
  }
`;

有些人还喜欢将更新 ID 作为更新输入的一部分:

const typeDefs = `
  input AddBookInput {
    title: String!
    author: String!
  }

  input UpdateBookInput {
    # NOTE: all fields, except the 'id' (the selector), are optional for the update input 
    id: String!
    title: String
    author: String
  }

  type Book {
    id: ID!
    title: String!
    author: String!
  }

  type Query {
    books: [Book!]!
  }

  type Mutation{
    addBook(input: AddBookInput!): Book
    updateBook(input: UpdateBookInput!): Book
  }
`;

最后,您可能希望使用“有效负载”类型作为返回类型 - 以增加灵活性(为您提供更多回旋空间,以便稍后更改返回类型,而不会破坏您的 API):

const typeDefs = `
  input AddBookInput {
    title: String!
    author: String!
  }

  input UpdateBookInput {
    # NOTE: all fields, except the 'id' (the selector), are optional for the update input 
    id: String!
    title: String
    author: String
  }

  type Book {
    id: ID!
    title: String!
    author: String!
  }

  type AddBookPayload {
    book: Book!
  }

  type UpdateBookPayload {
    book: Book!
  }

  type Query {
    books: [Book!]!
  }

  type Mutation{
    addBook(input: AddBookInput!): AddBookPayload!
    updateBook(input: UpdateBookInput!): UpdateBookPayload!
  }
`;

希望这可以帮助!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

graphql,当有“add”和“update”突变时如何设计输入类型? 的相关文章

随机推荐