Skip to main content

Resolvers

Grats leverages graphql-js for its execution engine, this means each resolver is passed the conventional four arguments:

obj

The parent object, which for a field on the root Query type is often not used.

note

When defining your resolvers as methods on a class, the initial obj argument is omitted in favor of this.

When using the functional or static method style, Grats inspects the type annotation of the first argument to determine which which type this field is being defined on. In other word, the definition of the type applied to the obj argument must be annotated with /** @gqlType */. Grats will report a helpful error if you forget to do this.

args

The arguments provided to the field in the GraphQL query.

Args must be annotated with an explicit inline literal type. Grats will inspect this type declaration to determine the GraphQL type of the expected arguments.

context

A value which is provided to every resolver and holds important contextual information. This generally used for things like:

  • Information about the current request
  • Context about the currently logged in user
  • Per-request caches, such as DataLoaders

Grats will ensure that all resolvers in your project use reference the same type for the context argument.

info

A value which holds field-specific information relevant to the current query as well as the schema details, also refer to type GraphQLResolveInfo for more details.

This is rarely used, but can be useful for advanced cases such as trying to optimize database queries to perform joins or only fetch the fields that are actually requested.

Class Method Example

/** @gqlType */
class User {
_bestFriendID: number;
/** @gqlField */
bestFriend(args: { order: string }, context: GqlContext): User {
return context.db.getSortedFriends(this._bestFriendID, args.order);
}
}

type GqlContext = {
db: { getSortedFriends(id: number, order: string): User };
};
Playground

Functional Style Example

note

Grats will inspect the type of the first argument in order to determine which GraphQL type the field is being added to.

/** @gqlType */
type User = {
_bestFriendID: number;
};

/** @gqlField */
export function friends(
user: User,
args: { order: string },
context: GqlContext,
): User {
return context.db.getSortedFriends(user._bestFriendID, args.order);
}

type GqlContext = {
db: { getSortedFriends(id: number, order: string): User };
};
Playground