0

Basic info: 在后端使用 Postgres,在前端使用 Postgraphile 使用 GraphQL。

Need:使用 GraphQL 突变来更新 Postgres 数据库中的一行。

Code:假设我有一个 library_account 模式,它在 Postgres 中有 book 表,其中包含 id、title、borrower_id 和 is_available 等字段。

Scenario: 第一次借。

Proposed flow: 进行 GraphQL 突变以使用 borrower_id 更新 Postgres 表。

我目前使用的代码:

mutation BookUpdates(
  $title: String,
  $borrower_id: Int!, #not really an Int but for the sake of ease.
  $author_id: Int!,
  $isle_id: Int!,
  $is_available: Boolean
) {
  updateBookByAuthorIdAndIsleId(input: {
    isle_id: $isle_id,
    is_available: $is_available,
    borrower_id: $borrower_id,
    author_id: $author_id
}) {
  bookEdge {
    node {
      author_id
    }
  }
}

在这里,我收到一个错误borrower_id,指出borrower_id 不是由 type 定义的updateBookByAuthorIdAndIsleId

有什么建议么??

4

1 回答 1

3

在 GraphQL 中构建查询和突变时,使用 GraphiQL 之类的客户端通常是明智的,它将通过提供文档、自动完成功能和突出显示错误发生的位置来帮助您。PostGraphile 内置了 GraphiQL;它在 CLI 上默认启用,但如果您在库模式下使用它,则必须通过graphiql: true启用它。无论哪种方式,我都建议您使用--enhance-graphiql/enhanceGraphiql: true标志。如果您将您的突变放入 GraphiQL 中,它应该会告诉您哪里出了问题,甚至可能会建议如何修复它!

在我看来,您的突变形状略有错误。PostGraphile 遵循中继输入对象突变规范,这意味着我们将所有突变输入嵌套在输入参数下,就像您所做的那样。但是,我们还将有关记录的详细信息组合在一起,以便在进行更新时更容易将“what”与“how”分开 - 例如“what”:authorId: 27, isleId: 93,“how”:patch: {text: $text}- 这也允许您更新键(例如,如果您想更改 isleId),如果所有列都放在一起,这是不可能的。这是你缺少的部分,我相信。

我怀疑你的突变应该更像:

mutation BookUpdates(
  $borrower_id: Int!, #not really an Int but for the sake of ease.
  $author_id: Int!,
  $isle_id: Int!,
  $is_available: Boolean
) {
  updateBookByAuthorIdAndIsleId(input: {
    isleId: $isle_id,
    authorId: $author_id
    bookPatch: {
      isAvailable: $is_available,
      borrowerId: $borrower_id,
    }
}) {
  bookEdge {
    node {
      authorId
    }
  }
}

我还对您的字段名称进行了驼峰命名,但如果您加载了自定义变形器,这可能不是必需的/不可取的。

于 2019-02-27T08:51:59.287 回答