Lab 08: GraphQL Architecture
Overview
Step 1: Pothos — Code-First Schema Builder
import SchemaBuilder from '@pothos/core';
interface Types {
Objects: {
User: User;
Post: Post;
Query: {};
};
Scalars: {
Date: { Input: Date; Output: Date };
};
Context: {
userId: string;
db: Database;
loaders: DataLoaders;
};
}
const builder = new SchemaBuilder<Types>({});
// Define types — fully inferred from TypeScript interfaces
builder.objectType('User', {
description: 'A registered user',
fields: (t) => ({
id: t.exposeString('id'),
name: t.exposeString('name'),
email: t.exposeString('email'),
// Computed field
displayName: t.field({
type: 'String',
resolve: (user) => `${user.name} <${user.email}>`,
}),
// Relation — loaded via DataLoader
posts: t.field({
type: ['Post'],
resolve: (user, _args, ctx) => ctx.loaders.postsByUserId.load(user.id),
}),
}),
});Step 2: Queries and Mutations
Step 3: DataLoader — N+1 Prevention
Step 4: GraphQL Yoga Server
Step 5: Type-Safe Client with gql.tada
Step 6: graphql-code-generator
Step 7: Input Validation at Schema Level
Step 8: Capstone — GraphQL Schema Execution
Summary
Feature
Tool
Benefit
Last updated
