【发布时间】:2019-03-15 15:23:18
【问题描述】:
在学习过程中与大家联系,并将 Apollo 和 graphQL 集成到我的一个项目中。到目前为止一切正常,但现在我正在尝试进行一些突变,并且我正在努力处理输入类型和查询类型。我觉得它比应有的复杂得多,因此我正在寻找有关如何管理我的情况的建议。我在网上找到的示例总是带有非常基本的 Schema,但现实总是更复杂,因为我的 Schema 很大并且看起来如下(我将只复制一部分):
type Calculation {
_id: String!
userId: String!
data: CalculationData
lastUpdated: Int
name: String
}
type CalculationData {
Loads: [Load]
validated: Boolean
x: Float
y: Float
z: Float
Inputs: [Input]
metric: Boolean
}
然后定义输入和负载,依此类推...
为此,我想要一个突变来保存“计算”,所以在同一个文件中我有这个:
type Mutation {
saveCalculation(data: CalculationData!, name: String!): Calculation
}
我的解析器如下:
export default resolvers = {
Mutation: {
saveCalculation(obj, args, context) {
if(context.user && context.user._id){
const calculationId = Calculations.insert({
userId: context.user._id,
data: args.data,
name: args.name
})
return Calculations.findOne({ _id: calculationId})
}
throw new Error('Need an account to save a calculation')
}
}
}
然后我的突变如下: 从'graphql-tag'导入gql;
export const SAVE_CALCULATION = gql`
mutation saveCalculation($data: CalculationData!, $name: String!){
saveCalculation(data: $data, name: $name){
_id
}
}
`
最后我正在使用 Mutation 组件来尝试保存数据:
<Mutation mutation={SAVE_CALCULATION}>
{(saveCalculation, { data }) => (
<div onClick={() => saveCalculation({ variables : { data: this.state, name:'name calcul' }})}>SAVE</div>
}}
</Mutation>
现在我收到以下错误:
[GraphQL 错误]:消息:Mutation.saveCalculation(data:) 的类型 必须是输入类型,但得到:CalculationData!.,位置:未定义, 路径:未定义
从我的研究和其他一些 SO 帖子中,我知道除了 Query 类型之外,我还应该定义 Input 类型,但 Input 类型只能是 avec Scalar 类型,但我的模式取决于其他模式(这不是标量)。当最后一个只有标量类型时,我可以根据其他输入类型等创建输入类型吗?我有点迷路了,因为它似乎有很多冗余。非常感谢有关最佳实践的一些指导。我相信 Apollo/graphql 可以随着时间的推移在我的项目上为我带来很好的帮助,但我不得不承认,当 Schema 有点复杂时,实现它比我想象的要复杂。在线示例通常坚持使用 String 和 Boolean。
【问题讨论】: