【问题标题】:AWS Amplify: The variables input contains a field name that is not defined for input object typeAWS Amplify:变量输入包含未为输入对象类型定义的字段名称
【发布时间】:2020-12-05 07:02:52
【问题描述】:

我不明白这里发生了什么。

这是我的架构:

type MonthResume @model @auth(rules: [{allow: owner, identityClaim: "sub"}]){
   id: ID!
   incomes: Float!
   spendingByCategory: [Category]
}

type Category @model @auth(rules: [{allow: owner, identityClaim: "sub"}]){
  id: ID!
  name: String!
  amount: Float!
}

这是 Amplify 提供给我的自动生成的更新突变:

export const updateMonthResume = /* GraphQL */ `
  mutation UpdateMonthResume(
  $input: UpdateMonthResumeInput!
  $condition: ModelMonthResumeConditionInput
 ) {
 updateMonthResume(input: $input, condition: $condition) {
  id
  incomes
  spendingByCategory {
    id
    name
    amount
    createdAt
    updatedAt
    owner
  }
  createdAt
  updatedAt
  owner
}
}
`;

这是我的意见:

{
  "input": {
    "id": "d7f-ee2971fd3ae5",
    "incomes": 220,
    "spendingByCategory": null,
    "createdAt": "2020-08-15T17:06:22.192Z",
    "updatedAt": "2020-08-15T17:06:22.192Z",
    "owner": "subId"
  }
}

我只想更新收入金额,因此我以这种方式调用 api:

const input = {
  incomes: 0,
}

await API.graphql(graphqlOperation(updateMonthResume, input));

然后,我得到了错误。

我不明白,我不想更新超过收入,我需要改变我的输入吗?但是我为 objetc 支出分类发送了一个空值(Amplify 会自动执行)。

input CreateMonthResumeInput {
   id: ID
   incomes: Float!

}

【问题讨论】:

  • 输入对象只能具有UpdateMonthResumeInput 类型中定义的属性,不能更多 - 可以更少(如果可以为空/不需要) - 但都是必需的
  • 其余属性由 Amplify 默认定义(createdAt、updatedAd 和 owner)。问题是我只想输入要更新的属性,仅此而已,但是当 Amplify 发送输入时,它会将支出分类类别添加为 null,这给了我错误。
  • UpdateMonthResumeInput 定义?

标签: graphql aws-amplify


【解决方案1】:

总结评论的讨论/积累知识:

输入对象只能有UpdateMonthResumeInput类型定义的属性,

  • 没有了
  • 可以更少(如果可以为空/不需要)
  • ...但都是必需的

通常有以下区别:

  • 输入类型(用于突变作为输入/参数)
  • ...和返回类型(查询和突变的结果类型)

...以及相关问题/答案:

为什么在这个输入中没有显示属性spendingByCategory

因为它不是the MonthResume body(自己的类型字段/属性) - 它来自关系......就像创建用户然后添加用户朋友 - 不可能一次创建带有朋友的用户 - 不支持嵌套突变。

如果我想添加一个对象数组,没有关系,应该指定什么?我设置spendingByCategory: [Category!]只是因为我没有找到类型Object

每个 [query/mutation] 深度级别都需要是一个已定义的、单独的类型(以及类型之间的关系)在 graphql 中。您可以使用“customJSON 类型”(任何可序列化或未知类型的内容),而无需为复杂的字段/属性定义类型。

【讨论】:

  • 关于发生的事情的非常好的简历,日志可能会混淆。
【解决方案2】:

好的,我解决了这个问题。

与 SpendingCategory 无关(这是我收到的日志,我正在使用该参考搜索问题)。

我有错误的输入属性,因此它调度了那个错误。

请确保您输入的对象是完全正确的,然后再使用其他日志。

【讨论】:

  • 要完成...您的 UpdateMonthResumeInput defs 是...?
  • 正确的输入是没有owner、createdAt和updateAt。这些属性位于 Amplify 生成的突变上,但您在调度突变时不需要发送它们,因为 Amplify 会为您完成,这是我的问题。
  • 通常这就是输入类型(用于突变作为输入/参数)和返回类型(查询和突变的结果类型)之间的区别 - 它是在生成的 输入类型 中?你能显示UpdateMonthResumeInputdefs 吗?
  • 不,仍然不是正确的 def(突变之一已经在这里):) 它应该像 input UpdateMonthResumeInput - 你也可以从 graphiql docs 获得它
  • 因为它不是“MonthResume 正文” - 它来自关系......就像创建用户然后添加用户好友 - 不可能一次创建带有朋友的用户 - 不支持嵌套突变
【解决方案3】:

我在使用 Lambda 函数时遇到了这个问题,发现为了传入正确的用户属性(所有者),我必须在 graphql.schema 中定义输入对象以包含所有者——所有者是从创建数据库记录的 lambda 函数的客户端。由于 api 调用来自 lambda 函数,因此如果留给 graphql,不确定所有者是谁。

【讨论】:

    猜你喜欢
    • 2021-10-01
    • 2022-01-07
    • 2015-02-27
    • 1970-01-01
    • 2019-11-30
    • 2020-01-09
    • 2021-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多