Nestjs教程使用TypeGraphQL与Apollo Server构建GraphQL服务

在使用NestJS结合TypeGraphQL和Apollo Server构建GraphQL服务时遇到几个问题:

  1. 如何正确配置TypeGraphQL模块与NestJS集成?官方文档的示例不太清晰,特别是装饰器与NestJS依赖注入的配合方式。

  2. Apollo Server在NestJS中需要单独配置中间件吗?与Express/Fastify的兼容性是否有特殊注意事项?

  3. 使用@Resolver()时,如何处理复杂的业务逻辑分层?比如Service层与Resolver之间是否需要有额外抽象?

  4. 类型合并(Type Merging)在实际项目中如何实现?遇到多个数据源组装一个GraphQL类型时总是报类型冲突。

  5. 生产环境部署时,性能监控和优化有哪些针对性的方案?比如缓存策略或Dataloader的集成方式。

希望能得到实际项目经验的分享,最好能提供代码片段说明关键配置点。


3 回复

在NestJS中使用TypeGraphQL和Apollo Server构建GraphQL服务是个不错的选择。首先安装依赖:

npm install @nestjs/graphql type-graphql apollo-server graphql reflect-metadata

接着启用反射并配置 AppModule:

import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';

@Module({
  imports: [
    GraphQLModule.forRoot({
      autoSchemaFile: 'schema.gql',
      sortSchema: true,
      playground: true,
    }),
  ],
})
export class AppModule {}

然后创建一个简单的Resolver:

import { Args, Query, Resolver } from '@nestjs/graphql';
import { Inject, UseGuards } from '@nestjs/common';
import { MyService } from './my.service';

@Resolver()
export class MyResolver {
  constructor(@Inject(MyService) private readonly service: MyService) {}

  @Query(() => String)
  async helloWorld(@Args('name') name: string): Promise<string> {
    return `Hello ${name}`;
  }
}

最后实现业务逻辑服务MyService:

import { Injectable } from '@nestjs/common';

@Injectable()
export class MyService {
  getData() {
    return { message: 'This is data from service' };
  }
}

这样就完成了基本的GraphQL服务搭建。


要使用NestJS、TypeGraphQL和Apollo Server构建GraphQL服务,首先初始化一个NestJS项目。安装必要的依赖:

npm install @nestjs/graphql graphql apollo-server graphql-tools class-validator class-transformer type-graphql

接着配置app.module.ts

import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';

@Module({
  imports: [
    GraphQLModule.forRoot({
      autoSchemaFile: 'schema.gql',
      sortSchema: true,
      playground: true,
    }),
  ],
})
export class AppModule {}

创建Resolver类,结合TypeGraphQL定义模式:

import { Resolver, Query, Args } from '@typegraphql/nestjs';
import { Student } from './student.schema';
import { StudentService } from './student.service';

@Resolver()
export class StudentResolver {
  constructor(private studentService: StudentService) {}

  @Query(() => [Student])
  async students(): Promise<Student[]> {
    return this.studentService.getAllStudents();
  }
}

编写服务逻辑并运行项目。这样就搭建了一个基础的GraphQL服务,支持查询学生数据。通过Apollo Playground可以测试接口。

以下是使用NestJS + TypeGraphQL + Apollo Server 构建 GraphQL 服务的简明教程:

  1. 安装依赖
npm install @nestjs/graphql graphql apollo-server-express type-graphql
  1. 创建基本结构
// src/graphql.module.ts
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';

@Module({
  imports: [
    GraphQLModule.forRoot<ApolloDriverConfig>({
      driver: ApolloDriver,
      autoSchemaFile: true,
    }),
  ],
})
export class GraphqlModule {}
  1. 创建Resolver示例
// src/book/book.resolver.ts
import { Query, Resolver } from 'type-graphql';

@Resolver()
export class BookResolver {
  @Query(() => String)
  hello() {
    return 'Hello from GraphQL!';
  }
}
  1. 创建Schema示例
// src/book/book.schema.ts
import { Field, ObjectType } from 'type-graphql';

@ObjectType()
export class Book {
  @Field()
  title: string;

  @Field()
  author: string;
}
  1. 完整Resolver示例
// src/book/book.resolver.ts
import { Query, Resolver, Args } from 'type-graphql';
import { Book } from './book.schema';

@Resolver(() => Book)
export class BookResolver {
  private books: Book[] = [
    { title: 'The Hobbit', author: 'J.R.R. Tolkien' },
  ];

  @Query(() => [Book])
  books(): Book[] {
    return this.books;
  }

  @Query(() => Book)
  book(@Args('title') title: string): Book {
    return this.books.find(book => book.title === title);
  }
}
  1. 注册模块
// src/app.module.ts
import { Module } from '@nestjs/common';
import { GraphqlModule } from './graphql.module';
import { BookResolver } from './book/book.resolver';

@Module({
  imports: [GraphqlModule],
  providers: [BookResolver],
})
export class AppModule {}

启动服务后访问 /graphql 即可看到 Apollo Studio 界面。

关键点:

  1. 使用 @nestjs/graphql 集成 Apollo Server
  2. 通过 type-graphql 装饰器定义 Schema 和 Resolver
  3. 自动生成 GraphQL 类型定义
  4. 支持 Query/Mutation/Subscription 等操作

记得在 main.ts 中正常启动 NestJS 应用即可。

回到顶部