2016-07-18 12 views
1

GraphQLのカーソルとMongoDBのカーソルとの関係を混同しています。GraphQL&MongoDBカーソル

私は現在、オブジェクト(mongoドキュメント)を作成し、既存の接続(mongoコレクション)に追加する変異に取り組んでいます。オブジェクトを追加するとき、突然変異は追加されたエッジを返します。どのように見えるか:

{ 
    node, 
    cursor 
} 

ノードは実際に追加されたドキュメントですが、私はカーソルとして返すべきものを混同しています。

const CreatePollMutation = mutationWithClientMutationId({ 
    name: 'CreatePoll', 

    inputFields: { 
    title: { 
     type: new GraphQLNonNull(GraphQLString), 
    }, 
    multi: { 
     type: GraphQLBoolean, 
    }, 
    options: { 
     type: new GraphQLNonNull(new GraphQLList(GraphQLString)), 
    }, 
    author: { 
     type: new GraphQLNonNull(GraphQLID), 
    }, 
    }, 

    outputFields: { 
    pollEdge: { 
     type: pollEdgeType, 
     resolve: (poll => (
     { 
      // cursorForObjectInConnection was used when I've tested using mock JSON data, 
      // this doesn't work now since db.getPolls() is async 
      cursor: cursorForObjectInConnection(db.getPolls(), poll), 
      node: poll, 
     } 
    )), 
    }, 
    }, 

    mutateAndGetPayload: ({ title, multi, options, author }) => { 
    const { id: authorId } = fromGlobalId(author); 
    return db.createPoll(title, options, authorId, multi); //promise 
    }, 

}); 

ありがとう:

これが私の変異であります!

答えて

1

おそらくもう少し遅いかもしれませんが、多分この問題を抱える他の人に役立つでしょう。

解決方法から約束を返すだけです。次に、実際のpolls配列を使用してカーソルを作成することができます。これと同じように:

resolve: (poll => 
    return db.getPolls().then(polls => { 
     return { cursor: cursorForObjectInConnection(polls, poll), node: poll } 
    }) 
) 

しかし、注意し、あなたのpollpolls内のオブジェクトは現在、異なる起源を持っており、厳密に等しくありません。 cursorForObjectInConnectionはjavacriptのindexOfを使用しているため、カーソルはおそらくnullになります。これを防ぐには、オブジェクトインデックスを自分で見つけてoffsetToCursorを使って、hereのようにカーソルを構成する必要があります。

関連する問題