2017-06-06 7 views
0

Relay MutationとglobalIdFieldのRefsがついています。サーバー側のリレー・ミューテーションで別のモデルへの参照を実装する方法は?

だから、小道具にポストIDを持っていると私は、次のスキーマで定義された変異を持っている必要があります、のは、そのコメントが親コメントIDを持つことができるとしましょう:

const createComment = mutationWithClientMutationId({ 
    name: 'CreateComment', 
    description: 'Create comment of the post', 
    inputFields: { 
    content: { 
     type: new GraphQLNonNull(GraphQLString), 
     description: 'Content of the comment', 
    }, 
    parent: { 
     type: GraphQLID, 
     description: 'Parent of the comment', 
    }, 
    post: { 
     type: new GraphQLNonNull(GraphQLID), 
     description: 'Post of the comment', 
    }, 
    }, 
    outputFields: { 
    comment: { type: commentType, resolve: comment => comment }, 
    }, 
    mutateAndGetPayload: (input, context) => (context.user 
    ? Comment.create(Object.assign(input, { author: context.user._id })) 
    : new Error('Only logged in user can create new comment')), 
}); 

私のコメントがあまりにもglobalIdField、postTypeを持っています。私はクライアントからの突然変異を照会するときに、このオブジェクトの実際のmongo _idの代わりにどこでもglobalIdsを使用します。 「のでinputFieldsのフィールドができ、私はポストにglobalIdFieldを()を追加することができますが、リレーはこれを渡すことができない場合、それは非常にconvinientすることができ

mutateAndGetPayload: (input, context) => { 
    if (input.parent) input.parent = fromGlobalId(input.parent).id; 
    if (input.post) input.post = fromGlobalId(input.post).id; 
    // And other logic 
} 

:ここでそれのためのより良い方法の代わりにmutateAndGetPayloadで、この作品ですglobalIdFieldにはリゾルバ関数があります。

答えて

0

これまでのところ私は、下記のより良い解決策を見つけることができません。

mutateAndGetPayload: ({ content, post, parent }, context) => { 
    if (!context.user) throw new Error('Only logged in user can create new comment'); 
    const newComment = { author: context.user._id, content }; 
    if (post) newComment.post = fromGlobalId(post).id; 
    if (parent) newComment.parent = fromGlobalId(parent).id; 
    return Comment.create(newComment); 
    }, 

は、誰かがこれでより良い体験を提供しますので、もし喜んでいるだろう。

関連する問題