The code-first approach lets you create your GraphQL API by writing code first. This means you define your data and logic in code, and the GraphQL schema is generated automatically.
Code-first approach in NestJS
import { ObjectType, Field, Int } from '@nestjs/graphql'; @ObjectType() export class Sample { @Field(type => Int) id: number; @Field() name: string; }
@ObjectType marks a class as a GraphQL type.
@Field marks class properties as GraphQL fields and can specify their types.
import { ObjectType, Field } from '@nestjs/graphql'; @ObjectType() export class User { @Field() username: string; @Field() email: string; }
import { ObjectType, Field, Int } from '@nestjs/graphql'; @ObjectType() export class Post { @Field(type => Int) id: number; @Field() title: string; @Field({ nullable: true }) content?: string; }
This example shows a Book type and a resolver that returns a list of books. The GraphQL schema is generated from the Book class and the resolver methods.
import { Resolver, Query } from '@nestjs/graphql'; import { ObjectType, Field, Int } from '@nestjs/graphql'; @ObjectType() class Book { @Field(type => Int) id: number; @Field() title: string; @Field() author: string; } @Resolver(of => Book) export class BookResolver { private books: Book[] = [ { id: 1, title: '1984', author: 'George Orwell' }, { id: 2, title: 'The Hobbit', author: 'J.R.R. Tolkien' }, ]; @Query(returns => [Book]) books() { return this.books; } }
Use decorators like @ObjectType and @Field to define your GraphQL types in code.
The code-first approach automatically creates the schema, so you don't write .graphql files.
This approach keeps your API definitions and business logic together, making maintenance easier.
The code-first approach means writing your GraphQL types and resolvers in code first.
Decorators mark classes and fields to generate the GraphQL schema automatically.
This method is great for quick development and keeping code organized.
Practice
Solution
Step 1: Understand code-first approach basics
The code-first approach means you write your GraphQL types and resolvers directly in TypeScript code using classes and decorators.Step 2: Compare with other approaches
Unlike schema-first, you do not write schema files manually; instead, the schema is generated automatically from your code.Final Answer:
Writing TypeScript classes and decorators to define GraphQL schema -> Option CQuick Check:
Code-first = Define schema in code [OK]
- Confusing code-first with schema-first approach
- Thinking schema files must be manually written
- Assuming REST is involved in code-first GraphQL
Solution
Step 1: Identify decorator for GraphQL object type
In code-first, @ObjectType() marks a class as a GraphQL object type to generate schema.Step 2: Differentiate from other decorators
@Resolver() marks resolver classes, @Query() marks query methods, and @Injectable() is for dependency injection, not schema types.Final Answer:
@ObjectType() -> Option AQuick Check:
@ObjectType = GraphQL type class [OK]
- Using @Resolver() instead of @ObjectType() for types
- Confusing @Query() with type decorators
- Thinking @Injectable() defines GraphQL schema
hello()?
import { Query, Resolver } from '@nestjs/graphql';
@Resolver()
export class HelloResolver {
@Query(() => String)
hello() {
return 'Hello, NestJS!';
}
}Solution
Step 1: Analyze the resolver method
The method hello() returns the string 'Hello, NestJS!'. The @Query decorator specifies the return type as String.Step 2: Understand GraphQL query result
When queried, the hello field returns the string value wrapped in quotes as a valid GraphQL string response.Final Answer:
"Hello, NestJS!" -> Option AQuick Check:
hello() returns string 'Hello, NestJS!' [OK]
- Expecting null or undefined instead of returned string
- Thinking missing return type causes runtime error
- Confusing resolver method with schema definition
import { Query, Resolver } from '@nestjs/graphql';
@Resolver()
export class SampleResolver {
@Query()
sample() {
return 123;
}
}Solution
Step 1: Check @Query decorator usage
The @Query decorator requires a return type function, e.g., @Query(() => Int) or @Query(() => String).Step 2: Identify missing return type
Here, @Query() is missing the return type, which causes schema generation errors.Final Answer:
Missing return type in @Query decorator -> Option BQuick Check:
@Query needs return type function [OK]
- Omitting return type in @Query decorator
- Adding @ObjectType to resolver class incorrectly
- Assuming async is mandatory for resolver methods
import { Field, ObjectType } from '@nestjs/graphql';
@ObjectType()
export class User {
@Field(() => String, { nullable: true })
nickname?: string;
}
What does this code do?Solution
Step 1: Understand @Field decorator options
The @Field decorator with { nullable: true } marks the field as nullable in GraphQL schema, allowing null values.Step 2: Check TypeScript optional property
Using ? in nickname?: string means the property is optional in TypeScript, matching nullable in GraphQL.Step 3: Confirm schema generation behavior
This combination correctly generates a GraphQL field that can be omitted or set to null without errors.Final Answer:
Defines a User type with an optional nullable nickname field in GraphQL schema -> Option DQuick Check:
nullable + optional = optional nullable field [OK]
- Omitting nullable option for optional fields
- Confusing optional in TypeScript with required in GraphQL
- Expecting errors for optional nullable fields
Ready to prove it?
Pass the test and this pattern moves unknown
