2017-02-22 7 views
0

Я писал API, который использует GraphQL. Я до сих пор довольно новичок в этом и сталкивался с некоторыми проблемами, связанными с мутациями. Упрощенная форма моего API имеет два типа записей. Существует запись контакта и запись тега. Запись контакта может содержать несколько записей тегов.Как сделать мутацию GrahpQL с вложенной схемой

Схема я написал для каждого из этих типов записей ниже:

const Tag = new graphQL.GraphQLObjectType({ 
name: 'Tag', 
description: 'Categorizes records into meaningful groups', 
fields:() => ({ 
    _id: { 
    type: graphQL.GraphQLID 
    }, 
    name: { 
    type: graphQL.GraphQLString 
    } 
}) 
}); 

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

я могу сделать мутацию достаточно легко на записях, таких как теги, так как они не содержат вложенные записи своих собственных, но я «Не знаю, как сделать мутацию на записи, например, контакты, так как она также может содержать теги. Мутация код, который я поставил на месте выглядит следующим образом:

const Mutation = new graphQL.GraphQLObjectType({ 
name: 'Mutation', 
fields: { 
    createContact: { 
    type: Contact, 
    description: "Create Contact", 
    args: { 
    name: {type: new graphQL.GraphQLNonNull(graphQL.GraphQLString)}, 
    tags: {type: new graphQL.GraphQLList(Tag)} 
    }, 
    resolve: function(source, args) { 
    return ContactModel.save(args.name); 
    } 
    } 
} 
}); 

Я не уверен, как завершить распознаватель в мутацией для того, чтобы иметь возможность сохранить контакт и запись тегов в то же время. Например, если я сделал запрос мутацию, чтобы сохранить новую запись контакта с новым тегом, как это:

{"query": "mutation createNewContact { 
contact: createContact (name: "John Smith", tags { name: "family" }) 
{_id, text, tags { name } } }" } 

есть что-то особенное, что мне нужно сделать в моей мутации схемы для того, чтобы обеспечить для этого типа мутация должна произойти?

ответ

0

Вы не можете использовать Tag как тип входного объекта, вы должны создать тип, как TagInput

const TagInput = new GraphQLInputObjectType({ 
    name: 'TagInput', 
    fields: { 
     _id: { type: GraphQLID }, 
     name: { type: GraphQLString } 
    } 
}); 

Рекомендуется всегда создавать Input версию обычного типа. Вы можете сделать то же самое с Contact, создав ContactInput. Тогда вы можете создать мутации очень похожим образом, вы сделали это

const Mutation = new GraphQLObjectType({ 
    name: 'Mutation', 
    fields: { 
     createContact: { 
      type: Contact, 
      args: { 
       contact: { type: new GraphQLNonNull(ContactInput) }, 
       tags: { type: new GraphQLList(TagInput) } 
      }, 
      resolve: (root, args, context) => { 
       console.log(args); 
       // this would console something like 
       // { contact: { name: 'contact name' }, 
       // tags: [ { name: 'tag#1' }, { name: 'tag#2' } ] } 
       // here create contact with tags 
      } 
    } 
}); 

query вы бы работать будет выглядеть, что

{ 
    "operationName": "createContact", 
    "query": "mutation createContact($contact: ContactInput!, $tags: [TagInput]) 
       { 
        createContact(contact: $contact, tags: $tags) { 
         _id 
         text 
         tags { 
          name 
         } 
        } 
       }", 
    "variables": { 
     contact: { name: "contact name" }, 
     tags: [ { name: "tag#1" }, { name: "tag#2" } ] 
    } 
} 
+0

Это работает. Благодаря! У меня есть проблема, хотя с возвратом данных тегов в ответ. Даже когда я просто возвращаю аргументы в resolver, когда ничего не делаю, все свойства возвращаются, но теги - просто пустой массив. Что-то вроде {contact: _id: 1, name: "John", tags: []}. Мне не хватает чего-то, что необходимо для возвращения данных тегов? – tbergen1

Смежные вопросы