1

我对 GraphQL 的游标和 MongoDB 的游标之间应该有什么关系感到困惑。

我目前正在研究创建对象(mongo 文档)并将其添加到现有连接(mongo 集合)的突变。添加对象时,突变返回添加的边缘。应该是这样的:

{
  node,
  cursor
}

虽然 node 是实际添加的文档,但我对应该作为光标返回的内容感到困惑。

这是我的突变:

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
  },

});

谢谢!

4

1 回答 1

1

对你来说可能有点晚了,但也许它会帮助其他人偶然发现这个问题。

只需从您的 resolve 方法返回一个承诺。然后,您可以使用实际polls数组创建光标。像这样:

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

但是要注意,你现在poll和里面的对象polls有不同的来源,并不严格相等。由于cursorForObjectInConnection使用 javascript,indexOf您的光标可能最终会变成null. 为防止出现这种情况,您应该自己找到对象索引并使用这里offsetToCursor讨论的那样构造您的光标。

于 2017-03-18T11:33:19.053 回答