'Context is empty in GraphQL middleware

I'm sending from frontend authorization token in headers and then I want to check validity of this token in some endpoints using middleware and context, but context is always empty.

I'm using type-graphql.

Frontend code (I check request in 'Network' tab and I can see my additional header):

  private async mutate<T>(
    mutation: DocumentNode,
    data: unknown,
    token?: string
  ) {
    const response = await apolloClient.mutate<T>({
      mutation: mutation,
      context: {
        headers: {
          'auth-token': token || '',
        },
      },
      variables: {
        data: data,
      },
    });
    return response.data;
  }

Resolver code:

 @Mutation(() => Token)
  @UseMiddleware(authMiddleware)
  async login(@Ctx() ctx: unknown, @Arg('data') data: LoginInput) {
    console.log(ctx);
   ...
  }

Middleware code:

export const authMiddleware: MiddlewareFn = ({ context }, next) => {
  console.log(context);
  try {
    return next();
  } catch (error) {
    return next();
  }
};

console.log is always equal to {}



Solution 1:[1]

I found the cause.

In declaration of ApollorServer the context was missing.

  const server = new ApolloServer({
    schema,
    context: ({ req }) => {
      const context = {
        req,
      };
      return context;
    },
    cors: {
      origin: '*',
      credentials: true,
    },
  });

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Monkey D. Teach