GraphQL и MongoDB курсоры

mongodb graphql relayjs graphql-js

277 просмотра

1 ответ

2717 Репутация автора

Я запутался в том, какова должна быть связь между курсорами 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
  },

});

Спасибо!

Автор: Gershon Papi Источник Размещён: 18.07.2016 07:40

Ответы (1)


1 плюс

33 Репутация автора

Возможно, немного поздно для вас, но, возможно, это поможет кому-то еще наткнуться на эту проблему.

Просто верните обещание из вашего метода разрешения. Затем вы можете создать свой курсор, используя ваш фактический pollsмассив. Вот так:

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

Но будьте осторожны , ваши pollобъекты и объекты pollsимеют разное происхождение и не являются строго равными. Поскольку cursorForObjectInConnectionиспользует JavaScript, indexOfваш курсор, вероятно, окажется null. Чтобы предотвратить это, вы должны найти индекс объекта самостоятельно и использовать его offsetToCursorдля создания курсора, как описано здесь .

Автор: bismuth Размещён: 18.03.2017 11:33
32x32