如何使用属性数组进行GraphQL变异?

时间:2017-03-22 02:25:03

标签: javascript graphql graphql-js

我的情况是用户可以同时保存带有某些相关标签的联系人记录。为此,我有一个名为“createContact”的变异,负责该操作。此突变的模式如下所示:

const Mutation = new graphQL.GraphQLObjectType({
name: 'Mutation',
fields: {
  createContact: {
    type: Contact,
    description: "Create Contact",
    args: {
      _id:  {type: new graphQL.GraphQLNonNull(graphQL.GraphQLString)},
      name: {type: new graphQL.GraphQLNonNull(graphQL.GraphQLString)},
      tags: {type: new graphQL.GraphQLList(TagInput)}
    },
    resolve: function(source, args, context) {

    // There is usually some DB code here to save data

    return args;
    }
  }
 }
});

我在之前的实现中遇到了一些问题,但没有为我的查询ObjectType创建一个InputType模拟标签,所以我为标签创建了以下InputType:

const TagInput = new graphQL.GraphQLInputObjectType({
  name: 'TagInput',
  description: 'Input type variation for the tag record for use in  mutations',
  fields: () => ({
    name: {
      type: graphQL.GraphQLString
    }
  })
 });

我使用以下查询测试我的设置:

{
  "query": "mutation createNewContact { 
                  contact: createContact ( 
                        _id: "contactID1", 
                        name: "John Smith", 
                        tags: [
                          { name: "friend" }, 
                          { name: "co-worker"}
                        ] 
                  ) 
                 {
                  _id, 
                  name, 
                  tags { 
                     name 
                   } 
                 } 
  } 
}

查询似乎工作正常,因为没有抛出的错误,请求中的所有数据都会进入解析器,但由于某些原因我还没弄清楚,它永远不会返回标记数据响应。我收到的回复是:

{
 "data": {
    "contact": {
        "_id": "contactID1",
        "name": "John Smith",
        "tags": []
    }
 }
}

当我在没有任何数据库操作的情况下直接返回args或者在其中执行数据库操作时,都会发生这种情况。我一直试图解决这个问题一段时间,但不知道为什么响应中没有返回任何标签。如果有人有任何想法,我很乐意听到他们。谢谢!

编辑:

这是我的联系人的对象类型:

联系人:

const Contact = new graphQL.GraphQLObjectType({
  name: 'Contact',
  description: 'Contact record',
  fields: () => ({
      _id: {
        type: graphQL.GraphQLID
      },
      name: {
        type: graphQL.GraphQLString
      },
      tags: {
        type: new graphQL.GraphQLList(Tag),
        resolve: function(src, args, context) {
          return TagModel.findByContactId(src._id)
            .then(tags => {
              return Promise.map(tags, (tag) => {
                return TagModel.findById(tag.tag_id);
              });
            });
        }
      }
  })
});

0 个答案:

没有答案