Integration with Nest
NestJS is a progressive Node.js framework for building efficient, reliable and scalable server-side applications.
GraphQL Yoga provides its own NestJS GraphQL Driver that supports building standalone GraphQL APIs and Federation GraphQL APIs (Gateway and Services).
Standalone GraphQL API
Installation
For the setup of a new Nest project, please make sure to read the Nest GraphQL documentation .
Schema-First Approach
With the following Nest project structure:
- src/
- cats/
- cats.graphql
- cats.resolver.ts
- cats.module.ts
- app.module.ts
- main.ts
and the following .graphql
schema definition (and its associated resolvers):
type Query {
cats: [Cat]
cat(id: ID!): Cat
}
type Mutation {
createCat(createCatInput: CreateCatInput): Cat
}
type Subscription {
catCreated: Cat
}
type Owner {
id: Int!
name: String!
age: Int
cats: [Cat!]
}
type Cat {
id: Int
name: String
age: Int
owner: Owner
}
"""
Test comment
"""
input CreateCatInput {
name: String
age: Int
}
Our Yoga Nest GraphQL Module (app.module.ts
) will be defined as follows:
import { YogaDriver, YogaDriverConfig } from '@graphql-yoga/nestjs'
import { Module } from '@nestjs/common'
import { GraphQLModule } from '@nestjs/graphql'
import { CatsModule } from './cats/cats.module'
@Module({
imports: [
CatsModule,
GraphQLModule.forRoot<YogaDriverConfig>({
driver: YogaDriver,
typePaths: ['./**/*.graphql'],
installSubscriptionHandlers: true
})
]
})
export class AppModule {}
Code-First Approach
The code-first approach generates the GraphQL Schema based on resolvers and models.
With the following example Recipe model:
import { Directive, Field, ID, ObjectType } from '@nestjs/graphql'
@ObjectType({ description: 'recipe ' })
export class Recipe {
@Field((type) => ID)
id: string
@Directive('@upper')
title: string
@Field({ nullable: true })
description?: string
@Field()
creationDate: Date
@Field((type) => [String])
ingredients: string[]
}
and the following resolvers:
@Resolver((of) => Recipe)
export class RecipesResolver {
constructor(private readonly recipesService: RecipesService) {}
// ...
@Query((returns) => [Recipe])
recipes(@Args() recipesArgs: RecipesArgs): Promise<Recipe[]> {
return this.recipesService.findAll(recipesArgs)
}
// ...
}
Our Yoga Nest GraphQL Module (app.module.ts
) will be defined as follows:
import { YogaDriver, YogaDriverConfig } from '@graphql-yoga/nestjs'
import { Module } from '@nestjs/common'
import { GraphQLModule } from '@nestjs/graphql'
import { RecipesModule } from './recipes/recipes.module'
@Module({
imports: [
RecipesModule,
GraphQLModule.forRoot<YogaDriverConfig>({
driver: YogaDriver,
autoSchemaFile: 'schema.gql'
})
]
})
export class AppModule {}
Apollo Federation
Additionally, Yoga offers a separate driver called @graphql-yoga/nestjs-federation
that supports building Apollo Federation Gateway and Services through the YogaGatewayDriver
and YogaFederationDriver
drivers.
A complete example is available in the repository .