如何在NestJS项目中正确集成Apollo Server来实现GraphQL服务?

如何在NestJS项目中正确集成Apollo Server来实现GraphQL服务?我按照一些教程配置了@nestjs/graphql和apollo-server,但启动时总是遇到模块依赖或Schema生成错误。能否提供一个完整的配置示例,包括:

  1. 如何设置GraphQLModule.forRoot()的基本参数
  2. 如何处理自定义Scalar类型和Directive
  3. 在Resolver中正确注入Service的姿势
  4. 常见的中间件拦截方案(比如权限验证)
  5. 生产环境需要注意的优化点(如Schema生成缓存)

最近在开发中遇到Resolver返回的Nullable字段被Apollo强制转为Non-Null导致客户端报错,不确定是配置问题还是类型定义遗漏,能否也一并说明?


3 回复

以下是一个简单的NestJS与GraphQL Apollo Server的集成教程:

  1. 初始化项目:
npm i -g @nestjs/cli
nest new nest-graphql
cd nest-graphql
  1. 安装依赖:
npm install @nestjs/graphql apollo-server graphql
  1. 创建模块和实体:
nest generate module products
nest generate service products
nest generate resolvers products
  1. 配置 app.module.ts:
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { ProductsModule } from './products/products.module';

@Module({
  imports: [
    ProductsModule,
    GraphQLModule.forRoot({
      autoSchemaFile: 'schema.gql',
      sortSchema: true,
    }),
  ],
})
export class AppModule {}
  1. 编写ProductsResolver:
import { Resolver, Query } from '@nestjs/graphql';
import { Product } from './product.entity';

@Resolver()
export class ProductsResolver {
  @Query(() => [Product])
  async products() {
    return [{ id: 1, name: 'Laptop' }, { id: 2, name: 'Phone' }];
  }
}
  1. 运行项目:
npm run start

访问 http://localhost:3000/graphql,即可使用Apollo Studio进行GraphQL操作。


要在NestJS中集成Apollo Server和GraphQL,可按以下步骤操作:

  1. 初始化项目:npm install @nestjs/graphql apollo-server graphql

  2. 创建模块和服务:

nest g module graphql
nest g service graphql
  1. 配置GraphQLModule: 在graphql.module.ts中导入GraphQLModule
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';

@Module({
  imports: [
    GraphQLModule.forRoot({
      autoSchemaFile: 'schema.gql',
      sortSchema: true,
    }),
  ],
})
export class GraphqlModule {}
  1. 定义数据模型与解析器: 创建一个Resolver类,在其中定义查询和变更。
import { Resolver, Query } from '@nestjs/graphql';

@Resolver()
export class AppResolver {
  @Query(() => String)
  hello(): string {
    return 'Hello World!';
  }
}
  1. 调试运行:使用npm run start:dev启动应用。

这样,你就完成了一个简单的NestJS与GraphQL的集成。进一步可添加复杂类型、参数化查询及变更等高级功能。

在NestJS中集成GraphQL Apollo Server的简明教程:

  1. 首先安装必要依赖:
npm install @nestjs/graphql graphql apollo-server-express
  1. 在AppModule中配置GraphQL模块:
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo';

@Module({
  imports: [
    GraphQLModule.forRoot<ApolloDriverConfig>({
      driver: ApolloDriver,
      autoSchemaFile: true, // 自动生成schema
      playground: true,     // 启用GraphQL Playground
    }),
  ],
})
export class AppModule {}
  1. 创建你的第一个Resolver:
import { Resolver, Query } from '@nestjs/graphql';

@Resolver()
export class HelloResolver {
  @Query(() => String)
  sayHello() {
    return 'Hello GraphQL!';
  }
}
  1. 将Resolver添加到模块:
@Module({
  providers: [HelloResolver],
})
export class HelloModule {}
  1. 运行应用并访问:
npm run start:dev

然后打开 http://localhost:3000/graphql 即可使用GraphQL Playground

高级配置选项:

  • 使用autoSchemaFile: 'schema.gql'生成schema文件
  • 添加context处理请求上下文
  • 配置subscriptions启用订阅功能
  • 使用introspection控制API introspection

记得在开发环境启用Playground,生产环境应关闭。

回到顶部