首页 > 解决方案 > 如何使用 apollo 服务器中的中间件对 graphql 关系解析器的结果进行解释?

问题描述

我有一个 graphql 类型UserReviewUserReply

type UserReview {
  _id
  content
}

type UserReply {
  _id
  reviewId
  content
}

我正在使用graphql-compose在评论和回复之间添加关系,以便在查询评论时我还将获得与评论相关的回复列表 -这很有效。现在我想对结果进行一些数据操作。首先,我尝试在 graphql-compose 中添加解析器中间件。但是userReviews解析器的结果只是一系列没有回复的评论。添加一些console.log语句后,我注意到填充评论回复字段的关系在评论解析器运行后运行,这是有道理的,因为子解析器首先需要父数据。

但是我仍然需要在结果返回给客户端之前以某种方式拦截结果。所以我想也许我不需要在graphql-compose级别而是在graphql服务器杠杆上拦截它(我正在使用Apollo服务器)。所以我添加了另一种中间件

import { applyMiddleware } from 'graphql-middleware'
import { schemaComposer } from 'graphql-compose'
export { UserReviewTC, UserReplyTC } from './UserReview'

const userReviewsMiddleware = {
  Query: {
    userReviews: async (resolve, parent, args, context, info) => {
      const result = await resolve(parent, args, context, info);
      // the result here still doesn't include replies!
      return result;
    }
  }
};
export const schema = applyMiddleware(
  schemaComposer.buildSchema(),
  userReviewsMiddleware
);

但结果仍然userReviewsMiddleware不包括回复字段。我的问题是如何在返回给客户之前通过回复获得完整的结果?

编辑:formatResponse我在 Apollo文档中看到了,但是在其中执行数据操作感觉不对,formatResponse因为我需要导入查询内部数据库的模块formatQuery

标签: javascriptgraphqlapollo-servergraphql-compose

解决方案


推荐阅读