2016-07-18 4 views
1

GraphQL의 커서와 MongoDB의 커서 사이의 관계에 대해 혼란스러워합니다.GraphQL & MongoDB 커서

저는 현재 개체 (몽고 문서)를 만들고 기존 연결 (몽고 컬렉션)에 추가하는 돌연변이 작업을하고 있습니다. 객체를 추가 할 때, 변이는 추가 된 가장자리를 반환합니다. 어떤 모양이어야합니다 :

{ 
    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은 자바 스크립트의 indexOf을 사용하므로 커서가 null이 될 수 있습니다. 이를 방지하려면 객체 인덱스를 직접 찾고 offsetToCursor을 사용하여 here과 같이 커서를 구성해야합니다.