当前位置: 首页 > 知识库问答 >
问题:

如何在GraphQL中插入(数组)字段列表进行变异查询

步博涉
2023-03-14

最近我开始研究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.',
    }
  })
});

猫鼬模式

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

共有2个答案

阮炯
2023-03-14

我遇到了同样的问题——我不知道如何在输入定义中指定对象数组。所以对于那些想看到“文本”模式解决方案的人来说:

type Book {
  title: String!
}

在您的输入类型中有一个书籍数组

input AuthorInput {
  name: String!
  age: Int!
}

您不能只添加书籍:[Book!] 在输入语句中,您需要故意创建包含所需字段的输入类型(如果愿意,请复制):

input BookInput {
  title: String!
}

然后你可以:

input AuthorInput {
  name: String!
  age: Int!
  books: [BookInput!]
}

端木志诚
2023-03-14

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

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

graphqlistmediaTypelocationType必须是输入类型。

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替换为它们的“输入”版本。

我建议创建mediaInputTypelocationInputType,它们将具有与mediaTypelocationType相同的字段结构,但创建时使用新的GraphQlinputObject类型({…),而不是新的GraphQLObjectType({…)。

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

 类似资料:
  • 目前,我正在从这里学习sangria-graphql。然而,我找不到任何关于突变(添加,更新,删除)的文档。还有,谷歌也不会帮我多少。你们能给我提供什么好的资源吗?

  • 我试图在数组字段类型上运行GraphQL筛选器查询,例如在文本ARRAY字段类型上。 在以下示例场景中: 创建表 我们可以通过以下方式之一对文本数组字段进行过滤: 对数组类型具有条件的SELECT语句 这在PostGres中也可以隐式地使用。 在Postgraphile GraphQL上,我们可以查询上表,如下所示: 查询 结果将是: 回答 有人能给我一些参考或建议,如何在Hasura中获得类似的

  • 我试图查询具有id数组的对象列表。类似于下面的SQL查询: 如何在GraphQL中实现这一点?

  • 我有一个自定义类数据列表,我想根据一个字段和值应该是另一个字段对它们进行分组。以下面的例子为例。 现在我想基于类对这些数据进行分组。预期的输出应该是一个映射,其中包含作为类的键和作为学生姓名列表的值。 我的代码是这样的:

  • 我正在尝试编写一个突变查询,它可以完美地与图形ql配合使用 这些是查询变量 这就是graphql突变的样子,现在我正尝试在angular中使用Apollo Client来构建这种突变 但是由于Array类型的变量$env,我得到了Http失败响应。字符串类型的变量没有问题,但是数组对象导致了这个错误。

  • 我是词的初学者。我在CodeIgniter中的insert_批处理函数中遇到错误。当我将数组插入insert_批处理时,我得到了这个错误 未知的列数组在字段列表和数组到字符串转换我已经做了很多解决方案,但仍然得到这个错误,有人能给我一个想法吗? 在我看来 控制器 模型函数 谁能告诉我如何解决这个问题?