在学习过程中以及将 Apollo 和 graphQL 集成到我的一个项目中时,与大家联系。到目前为止一切正常,但现在我正在尝试进行一些更改,并且正在为 Input 类型和 Query 类型苦苦挣扎。我觉得它比它应该的复杂得多,因此我正在寻找关于我应该如何管理我的情况的建议。我在网上找到的例子总是有非常基本的模式,但现实总是更复杂,因为我的模式很大,看起来如下(我只会复制一部分):
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>
现在我收到以下错误:
从我的研究和其他一些 SO 帖子中,我了解到除了 Query 类型之外,我还应该定义 Input 类型,但 Input 类型只能是 avec 标量类型,但我的架构依赖于其他架构(这不是标量)。当最后一个只有标量类型时,我可以根据其他输入类型等创建输入类型吗?我有点迷茫,因为它似乎有很多冗余。非常感谢有关最佳实践的一些指导。我相信 Apollo/graphql 随着时间的推移可以为我的项目带来很好的帮助,但我不得不承认,当 Schemas 有点复杂时,它比我想象的要复杂得多。在线示例通常使用字符串和 bool 值。
最佳答案
从 spec :
换句话说,您不能使用常规 GraphQLObjectType
s 作为 GraphQLInputObjectType
字段的类型——您必须使用另一个 GraphQLInputObjectType
。
当您使用 SDL 写出您的架构时,必须创建 Load
类型和 LoadInput
输入似乎是多余的,尤其是当它们具有相同的字段时。然而,在幕后,您定义的类型和输入变成了非常不同的对象类,每个类都有不同的属性和方法。 GraphQLObjectType
中不存在特定于 GraphQLInputObjectType
的功能(例如接受参数),反之亦然。
尝试代替另一个使用有点像尝试将方钉放入圆孔中。 “我不知道为什么我需要一个圆。我有一个正方形。它们都有一个直径。为什么我需要两个?”
除此之外,有一个很好的实际理由将类型和输入分开。那是因为在很多情况下,您将在类型上公开大量您不会在输入中公开的字段。
例如,您的类型可能包含实际上是基础数据组合的派生字段。或者它可能包含与其他数据关系的字段(如 friends
上的 User
字段)。在这两种情况下,将这些字段作为某些字段的参数提交的数据的一部分是没有意义的。同样,您可能有一些不想在其类型对应项上公开的输入字段(想到 password
字段)。
关于meteor - Apollo/GraphQl-类型必须为输入类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52744900/