首页 > 解决方案 > Graphql 嵌套突变

问题描述

我正在构建一个 Graphql 模式来变异/查询餐厅,并尝试将开放时间存储在嵌套对象中。

结构应如下所示:

        [
            { 
                monday: { open: restaurant.Open_Monday, close: restaurant.Close_Monday }

            },
            { 
                tuesday: { open: restaurant.Open_Tuesday, close: restaurant.Close_Tuesday }

            },
            { 
                wednesday: { open: restaurant.Open_Wednesday, close: restaurant.Close_Wednesday }

            },
            { 
                thursday: { open: restaurant.Open_Thursday, close: restaurant.Close_Thursday }

            },
            { 
                friday: { open: restaurant.Open_Friday, close: restaurant.Close_Friday }

            },
            { 
                saturday: { open: restaurant.Open_Saturday, close: restaurant.Close_Saturday }

            },
            { 
                sunday: { open: restaurant.Open_Sunday, close: restaurant.Close_Sunday }

            },
        ]

restaurant 变量包含 I' 的营业时间值,在将它们发送到 API 并存储它们之前进行格式化。

我的 Graphql 架构如下所示:

input RestaurantInput {
    key: Int!
    name: String!
    image: String!
    telNumber: String!
    bookingNumber: String
    address1: String!
    address2: String
    suburb: String!
    province: String!
    postalCode: String
    days: [DayInput]
    cuisine: String
    exclusions: String
    restrictions: String
    breakfast: String
    lunch: String
    supper: String
    longitude: String
    latitude: String
}

input DayInput {
     monday: [TimeInput]
     tuesday: [TimeInput]
     wednesday: [TimeInput]
     tursday: [TimeInput]
     friday: [TimeInput]
     saturday: [TimeInput]
     sunday: [TimeInput]
}

input TimeInput {
     open: String
     close: String
}

当我点击该 API 端点时,我收到以下错误消息:

Expected type [DayInput], found "[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]".

我不确定我的调用是否格式不正确,或者我是否在架构本身中犯了错误。我对 Graphql 还是很陌生,并且坚持这一点。

标签: javascriptapigraphqlschema

解决方案


您看到该错误是因为您的输入结构与您的架构不匹配。架构中的方括号 ( []) 表示一个列表——如果您将输入类型包装在方括号中,则相应的输入应该是一个数组。要拥有与您显示的数组匹配的架构,您应该从 around 删除括号TimeInput

input RestaurantInput {
  days: [DayInput]
  # other fields
}

input DayInput {
  monday: TimeInput
  tuesday: TimeInput
  wednesday: TimeInput
  thursday: TimeInput
  friday: TimeInput
  saturday: TimeInput
  sunday: TimeInput
}

input TimeInput {
  open: String
  close: String
}

但是,您也可以考虑完全简化此结构:

input RestaurantInput {
  days: DayInput # <---- remove the List here
  # other fields
}

input DayInput {
  monday: TimeInput
  tuesday: TimeInput
  wednesday: TimeInput
  thursday: TimeInput
  friday: TimeInput
  saturday: TimeInput
  sunday: TimeInput
}

input TimeInput {
  open: String
  close: String
}

然后,您可以只发送一个普通对象,而不使用数组:

{ 
  monday: { open: restaurant.Open_Monday, close: restaurant.Close_Monday },
  tuesday: { open: restaurant.Open_Tuesday, close: restaurant.Close_Tuesday },
  wednesday: { open: restaurant.Open_Wednesday, close: restaurant.Close_Wednesday },
  thursday: { open: restaurant.Open_Thursday, close: restaurant.Close_Thursday },
  friday: { open: restaurant.Open_Friday, close: restaurant.Close_Friday },
  saturday: { open: restaurant.Open_Saturday, close: restaurant.Close_Saturday },
  sunday: { open: restaurant.Open_Sunday, close: restaurant.Close_Sunday },
},

推荐阅读