[英]How to make a mutation query for inserting a list of (Array) fields in GraphQL
recently I started working on GraphQL, I am able to insert data in flat schema without any problem but when it comes to an Array of data I am getting an error like 最近我开始研究GraphQL,我能够在没有任何问题的情况下在平面模式中插入数据但是当涉及数据数组时,我收到的错误就像
{ "errors": [ { "message": "Must be input type" } ]}
I am testing my query using postman, my mutation query is 我正在使用邮递员测试我的查询,我的变异查询是
mutation M {
AddEvent
(
title: "Birthday event"
description:"Welcome to all"
media:[{url:"www.google.com", mediaType:"image" }]
location:[{address:{state:"***", city:"****"}}]
)
{title,description,media,location,created,_id}}
This is my Event Schema: 这是我的事件架构:
EventType = new GraphQLObjectType({
name: 'Event',
description: 'A Event',
fields: () => ({
_id: {
type: GraphQLString,
description: 'The id of the event.',
},
id: {
type: GraphQLString,
description: 'The id of the event.',
},
title: {
type: GraphQLString,
description: 'The title of the event.',
},
description: {
type: GraphQLString,
description: 'The description of the event.',
},
media:{
type:new GraphQLList(mediaType),
description:'List of media',
},
location:{
type:new GraphQLList(locationType),
description:'List of location',
}
})
});
// Media Type
export var mediaType = new GraphQLObjectType({
name: 'Media',
description: 'A Media',
fields: () => ({
_id: {
type: GraphQLString,
description: 'The id of the event.',
},
url:{
type: GraphQLString,
description: 'The url of the event.',
},
mediaType:{
type: GraphQLString,
description: 'The mediaTypa of the event.',
}
})
});
// Location Type
export var locationType = new GraphQLObjectType({
name: 'Location',
description: 'A location',
fields: () => ({
_id: {
type: GraphQLString,
description: 'The id of the event.',
},
address:{
type: GraphQLString,
description: 'The address.',
},
state:{
type: GraphQLString,
description: 'The state.',
},
city:{
type: GraphQLString,
description: 'The city.',
},
zip:{
type: GraphQLString,
description: 'The zip code.',
},
country:{
type: GraphQLString,
description: 'The country.',
}
})
});
Mongoose Schema: 猫鼬模式:
var EventSchema = new mongoose.Schema({
title: {
required: true,
type: String,
trim: true,
match: /^([\w ,.!?]{1,100})$/
},
description: {
required: false,
type: String,
trim: true,
match: /^([\w ,.!?]{1,100})$/
},
media: [{
url: {
type: String,
trim: true
},
mediaType: {
type: String,
trim: true
}
}],
location: [{
address: {
type: String
},
city: {
type: String
},
state: {
type: String
},
zip: {
type: String
},
country: {
type: String
}
}]
})
Mutation Type: 突变类型:
addEvent: {
type: EventType,
args: {
_id: {
type: GraphQLString,
description: 'The id of the event.',
},
title: {
type: GraphQLString,
description: 'The title of the event.',
},
description: {
type: GraphQLString,
description: 'The description of the event.',
},
media:{
type:new GraphQLList(mediaType),
description:'List of media',
},
location:{
type:new GraphQLList(locationType),
description:'List of media',
},
created: {
type: GraphQLInt,
description: 'The created of the user.',
}
},
resolve: (obj, {title,description,media,location,created,_id}) => {
let toCreateEvent = {
title,
description,
created:new Date(),
start: new Date(),
media,
location,
_id,
};
return mongo()
.then(db => {
return new Promise(
function(resolve,reject){
let collection = db.collection('events');
collection.insert(toCreateEvent, (err, result) => {
db.close();
if (err) {
reject(err);
return;
}
resolve(result);
});
})
});
}
}
Your issue is that when you define mutations, all types must be input types, hence the error you get "Must be input type"
. 您的问题是,当您定义突变时,所有类型都必须是输入类型,因此您得到的错误是
"Must be input type"
。 So in here (from your mutation): 所以在这里(来自你的变异):
media:{
type:new GraphQLList(mediaType),
description:'List of media',
},
location:{
type:new GraphQLList(locationType),
description:'List of media',
},
GraphQLList
, mediaType
and locationType
must be input types. GraphQLList
, mediaType
和locationType
必须是输入类型。
GraphQLList
is already an input type (see here https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L74-L82 to see the list of GraphQL types considered as input types). GraphQLList
已经是一种输入类型(请参阅https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L74-L82以查看被视为输入类型的GraphQL类型列表) 。
However your types mediaType
and locationType
are of GraphQLObjectType
type, which is not an input type but if you look at the list of input types again: https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L74-L82 , you'll find GraphQLInputObjectType
which is an object input type, so, what you need to do is to replace mediaType
and locationType
by their "input" version. 但是,您的类型
mediaType
和locationType
是GraphQLObjectType
类型,它不是输入类型,但是如果再次查看输入类型列表: https : //github.com/graphql/graphql-js/blob/master/src/type /definition.js#L74-L82 ,你会发现GraphQLInputObjectType
是一个对象输入类型,因此,你需要做的是用它们的“输入”版本替换mediaType
和locationType
。
What I suggest to do is to create mediaInputType
and locationInputType
which would have the same field structure as mediaType
and locationType
but created with new GraphQLInputObjectType({...
instead of new GraphQLObjectType({...
and use them in your mutation. 我建议做的是创建
mediaInputType
和locationInputType
,它们具有与mediaType
和locationType
相同的字段结构,但是使用new GraphQLInputObjectType({...
而不是new GraphQLObjectType({...
并在您的变异中使用它们)创建。
I ran into the same issue and I solved it like that, feel free to comment if you have any question. 我遇到了同样的问题,我就这样解决了,如果你有任何问题,请随时发表评论。
I ran into the same problem - I did not know how to specify array of objects in the input definition. 我遇到了同样的问题 - 我不知道如何在输入定义中指定对象数组。 So for those who wants to see a "text" schema solution:
因此对于那些想要查看“文本”架构解决方案的人:
type Book {
title: String!
}
to have an array of Books in your input type 在输入类型中包含一系列Books
input AuthorInput {
name: String!
age: Int!
}
you can not just add books: [Book!]
inside the input statement, you will need deliberately create input type containing needed fields (duplicate if you like): 你不能只是在输入语句中添加
books: [Book!]
,你需要刻意创建包含所需字段的输入类型(如果你愿意,可以重复):
input BookInput {
title: String!
}
and then you can: 然后你可以:
input AuthorInput {
name: String!
age: Int!
books: [BookInput!]
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.