问题描述
我的架构的一般结构是这样的:
- 一个例程可以有好几天。
- 一天可以进行多次练习。
我有一个由 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 中收到错误消息: 对象字面量只能指定已知属性,类型中不存在“天”
因为输入的类型是 CreateRoutineInput
看起来像这样:
export type CreateRoutineInput = {
id?: string | null,name: string,description?: string | null,};
为什么生成的 CreateRoutineInput 类型不允许我指定嵌套项“Days”? 我对 GraphQL 有点陌生,所以也许这是不应该做的事情。
非常感谢您的帮助,谢谢。
解决方法
好吧,我想我找到了解决方案,希望如果将来有人偶然发现此线程,这可能会有所帮助:
问题实际上是我的架构。我设置它的方式是每个“对象”都是一个@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!
}
如果您遇到困难,希望这对您有所帮助!当我修复它时,对我来说是一个很大的解脱。