如何在服务器端的 Relay Mutations 中实现对另一个模型的引用?

Posted

技术标签:

【中文标题】如何在服务器端的 Relay Mutations 中实现对另一个模型的引用?【英文标题】:How to implement reference to another model in Relay Mutations on the server side? 【发布时间】:2017-11-07 22:19:27 【问题描述】:

我被 Relay Mutation 和 globalIdField 中的 Refs 卡住了。

假设评论可以有父评论 id,必须在 props 中有帖子 id,并且我有一个使用以下模式定义的 Mutation:

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。当我从客户端查询突变时,我将在任何地方使用 globalIds 而不是这个对象的真实 mongo _id。这里是不是更好的方法,而不是 mutateAndGetPayload 中的这块:

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

如果我可以在 post 中添加 globalIdField() 会非常方便,但是 Relay 不能通过这个,因为 inputFields 中的字段不能具有 globalIdField 具有的解析器功能。

【问题讨论】:

【参考方案1】:

到目前为止,我找不到比以下更好的解决方案:

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);
  ,

如果有人能提供更好的体验,我会很高兴。

【讨论】:

以上是关于如何在服务器端的 Relay Mutations 中实现对另一个模型的引用?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Relay、GraphQL 和 React 渲染数据

基于protobuf协议的rpc实现

如何使用 Relay 发送临时查询?

如何在 Relay 中管理游标和排序?

GraphQL + Relay:如何执行重新获取授权?

避免在 Relay 中缓存