gpt4 book ai didi

node.js - 如何进行突变查询以在 GraphQL 中插入(数组)字段列表

转载 作者:IT老高 更新时间:2023-10-28 22:05:35 26 4
gpt4 key购买 nike

最近我开始研究 GraphQL,我能够毫无问题地在平面模式中插入数据,但是当涉及到数据数组时,我遇到了类似的错误

 { "errors": [ {  "message": "Must be input type" } ]}

我正在使用 postman 测试我的查询,我的变异查询是

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}}

这是我的事件架构:

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 架构:

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
}
}]
})

变异类型:

 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);
});
})
});
}
}

最佳答案

您的问题是,当您定义突变时,所有类型都必须是输入类型,因此您会得到 “必须是输入类型” 的错误。所以在这里(来自你的突变):

media:{
type:new GraphQLList(mediaType),
description:'List of media',
},
location:{
type:new GraphQLList(locationType),
description:'List of media',
},

GraphQLListmediaTypelocationType 必须是输入类型。

GraphQLList 已经是一种输入类型(请参阅此处 https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L74-L82 以查看被视为输入类型的 GraphQL 类型列表)。

但是您的类型 mediaTypelocationType 属于 GraphQLObjectType 类型,这不是输入类型,但如果您查看输入列表再次输入:https://github.com/graphql/graphql-js/blob/master/src/type/definition.js#L74-L82 ,你会发现 GraphQLInputObjectType 这是一个对象输入类型,所以,你需要做的就是将 mediaTypelocationType 替换为它们的 "输入”版本。

我建议做的是创建 mediaInputTypelocationInputTypemediaTypelocationType 但使用 new GraphQLInputObjectType({... 而不是 new GraphQLObjectType({... 创建并在您的突变中使用它们。

我遇到了同样的问题,我就这样解决了,如果您有任何问题,请随时发表评论。

关于node.js - 如何进行突变查询以在 GraphQL 中插入(数组)字段列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32304486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com