我在使用GraphQL中的变异时遇到一些困难,其中模式中的类型包含嵌套类型。所以说我有预订的数据类型:
const BookingType = new GraphQLObjectType({
name: 'Booking',
fields: () => ({
id: { type: GraphQLInt },
Date: { type: GraphQLString },
Venue: { type: GraphQLString }
})
});
在架构文件中,我也有一个根突变,如下所示:
createBooking: {
type: BookingType,
args: {
Date: { type: new GraphQLNonNull(GraphQLString) },
Venue: { type: new GraphQLNonNull(GraphQLString) }
},
resolve(parentValue, args){
return axios.post('http://localhost:3000/booking', args)
.then(resp => resp.data);
}
}
我可以在GraphiQL中写一个变异来为预订创建数据没问题:
mutation {
createBooking(
Date: "2018-03-12",
Venue: "Some place",
) {
id
Date
Venue
}
}
到目前为止一切顺利。现在,我需要在原始预订对象中添加嵌套类型,以记录分配给预订的工作人员。所以我为工作人员添加了类型(输入和输出类型)并将其添加到预订类型和变异中:
// output type
const AssignedStaffType = new GraphQLObjectType({
name: 'AssignedStaff',
fields: () => ({
id: { type: GraphQLInt },
Name: { type: GraphQLString }
})
});
// input type
const AssignedStaffInputType = new GraphQLInputObjectType({
name: 'AssignedStaffInput',
fields: () => ({
id: { type: GraphQLInt },
Name: { type: GraphQLString }
})
});
预订类型为:
const BookingType = new GraphQLObjectType({
name: 'Booking',
fields: () => ({
id: { type: GraphQLInt },
Date: { type: GraphQLString },
Venue: { type: GraphQLString },
Staff: { type: new GraphQLList(AssignedStaffType) }
})
});
根突变变为:
createBooking: {
type: BookingType,
args: {
Date: { type: new GraphQLNonNull(GraphQLString) },
Venue: { type: new GraphQLNonNull(GraphQLString) },
Staff: { type: new GraphQLList(AssignedStaffInputType) }
},
resolve(parentValue, args){
return axios.post('http://localhost:3000/booking', args)
.then(resp => resp.data);
}
}
我不知道的是如何在GraphiQL中制定变异,特别是作为员工的价值:
mutation {
createBooking(
Date: "2018-03-14",
Venue: "Some place",
Staff: // ??? <--- What goes here??
) {
id
Venue
Date
Staff
}
}
我试过给它一个对象,或者一个与AssignedStaffInputType具有相同结构的对象数组,但我只是得到一个错误('期待AssignedStaffInputType')。客户端(此实例中的GraphiQL)对模式中定义的AssignedStaffInputType一无所知,所以我不明白a)如何在客户端中使用此输入类型,或者b)我将如何填充这样的输入所需数据。
请帮忙!
答案 0 :(得分:0)
没关系,我明白了。实际上,我可以以正确的格式(在模式中的输入类型中指定)传递对象(或对象数组),并且它可以正常工作。我遇到问题的原因是我输入类型中的一个字段有错误的标量类型,这就是抛出错误。客户端不需要知道它看起来在架构中指定的类型。因此,上述有问题的突变实际上应该写成:
mutation {
createBooking(
Date: "2018-03-14",
Venue: "Some place",
Staff: [{staffId: 1}]
) {
id
Venue
Date
Staff{
Name
}
}
}