如何在服务器端的 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 中实现对另一个模型的引用?的主要内容,如果未能解决你的问题,请参考以下文章