How to interept the result on graphql relations resolver with middleware in apollo server?

314 Views Asked by At

I have a graphql type UserReview and UserReply:

type UserReview {
  _id
  content
}

type UserReply {
  _id
  reviewId
  content
}

I'm using graphql-compose to do add a relation between reviews and replies so that when querying a review I will also get a list associated replies with the review - this works. Now I want to perform some data manipulation on the result. First I tried adding resolver middleware in graphql-compose. But the result of userReviews resolver is just an array of reviews without replies. After adding some console.log statements I noticed that the relation which populates the replies field of review is run after reviews resolver is run which makes sense because child resolver needs parent data first.

But I still need to somehow intercept the result before it's returned to the client. So I thought maybe I need to intercept it not at graphql-compose level but on graphql server lever (I'm using Apollo server). So I added another kind of middleware:

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

but still the result from userReviewsMiddleware doesn't include replies field. My question is how to actually get the complete result with replies before it's returned to the client?

EDIT: I see that there's formatResponse in Apollo docs but it feels not right to perform data manipulation in formatResponse because I'd need to import modules which query the database inside formatQuery.

0

There are 0 best solutions below