突变中的 GraphQL 嵌套节点 - 对象文字只能指定已知属性,并且类型中不存在“天”
Posted
技术标签:
【中文标题】突变中的 GraphQL 嵌套节点 - 对象文字只能指定已知属性,并且类型中不存在“天”【英文标题】:GraphQL nested nodes in mutation - Object literal may only specify known properties, and 'days' does not exist in type 【发布时间】:2021-05-23 01:30:07 【问题描述】:我的架构的一般结构是这样的:
一个例程可以有好几天。 一天可以进行多次练习。我有一个由 AWS Amplify CLI 生成的 GraphQL 突变。
突变看起来像这样:
export const createRoutine = /* GraphQL */ `
mutation CreateRoutine(
$input: CreateRoutineInput!
$condition: ModelRoutineConditionInput
)
createRoutine(input: $input, condition: $condition)
id
name
description
days
items
id
routineID
name
description
exercises
items
id
dayID
name
description
reps
sets
`;
当我像这样进行 GraphQL 突变时:
const inp =
id: id,
name: "Test Routine Dynamic",
description: "Description for TRD",
days:
items:
id: id,
routineID: id,
name: "Day 1 of TRD",
description: "Description for Day 1 of TRD",
exercises:
items:
id: id,
dayID: id,
name: "Bench Press",
description: "Push the bar",
reps: "3",
sets: "5",
,
,
,
,
我的 IDE 收到一条错误消息: 对象字面量只能指定已知属性,类型中不存在'days'
因为输入的类型是CreateRoutineInput
,看起来像这样:
export type CreateRoutineInput =
id?: string | null,
name: string,
description?: string | null,
;
为什么生成的 CreateRoutineInput 类型不允许我指定嵌套项“Days”? 我对 GraphQL 有点陌生,所以也许这是不应该做的事情。
非常感谢任何帮助,谢谢。
【问题讨论】:
【参考方案1】:好吧,我想我找到了解决方案,希望将来如果有人偶然发现这个线程,这可能会有所帮助:
问题实际上是我的架构。我设置它的方式是每个“对象”都是一个@model。我认为这实际上意味着他们都有自己的身份验证规则和自己的表格。不过,这不是 100% 确定的!
我实际上并不真的需要将它们分开那么多,因为它们都是在等级上相互关联的。
所以我的架构之前看起来像这样:
type Routine
@model
@auth(...)
id: ID!
name: String!
description: String
days: [Day]! @connection(keyName: "byRoutine", fields: ["id"])
# day = post
type Day
@model
@key(name: "byRoutine", fields: ["routineID"])
@auth(...)
id: ID!
routineID: ID!
name: String
description: String
exercises: [Exercise] @connection(keyName: "byDay", fields: ["id"])
type Exercise
@model
@key(name: "byDay", fields: ["dayID"])
@auth(...)
id: ID!
dayID: ID!
name: String!
description: String
reps: String!
sets: String!
如您所见,它们都标有@model。 因此,经过许多其他尝试,我只是从嵌套类型中删除了所有标签,并将它们设为类型。然后它们被简单地用作父类型的字段的类型。
所以现在看起来像这样:
type Routine
@model
@auth(...)
id: ID!
name: String!
description: String
days: [Day]!
type Day
id: ID!
routineID: ID!
name: String
description: String
exercises: [Exercise]
type Exercise
id: ID!
dayID: ID!
name: String!
description: String
reps: String!
sets: String!
而且它有效!现在我可以创建嵌套突变。现在看起来像这样:
如果您遇到困难,希望这对您有所帮助!当我修复它时,这让我松了一口气。
【讨论】:
以上是关于突变中的 GraphQL 嵌套节点 - 对象文字只能指定已知属性,并且类型中不存在“天”的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Django 嵌套对象添加 GraphQL 突变?