2017-02-22 7 views
0

私はGraphQLを使用するAPIを作成しています。私はまだそれほど新しく、突然変異に関するいくつかの問題にぶち当たっています。私のAPIの単純な形式には2つのレコードタイプがあります。連絡先レコードとタグレコードがあります。連絡先レコードには複数のタグレコードが関連付けられています。入れ子になったスキーマを使用して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

あなたは常にあなたの通常のタイプのInputバージョンを作成することをお勧めしますTagInput

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

のようなタイプを作成する必要があり、入力されたオブジェクト型としてTagを使用することはできません。 ContactInputを作成してContactと同じことができます。あなたはそれ

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

ようになり実行します。ありがとう!タグのデータを返信しても問題はあります。リゾルバで何もしないときにargsを返すだけで、すべてのプロパティが戻ってきますが、タグは空の配列にすぎません。 {contact:_id:1、name: "John"、タグ:[]}のようなものです。タグのデータが返されるために必要なものがありませんか? – tbergen1

関連する問題