使用NestJS进行GraphQL模块开发

首先

这是我根据自己的理解所记录的备忘录,说明了如何进行制作。
如果是进行追加开发之类的话,应该按照步骤进行4及之后的操作,或者直接复制粘贴以便重复利用。
※如何处理共通化部分是个问题。

环境

"@nestjs/common": "^8.0.0",
"@nestjs/core": "^8.0.0",
"@nestjs/graphql": "^9.0.4",

"@nestjs/cli": "^8.0.0",

整体的趋势

    1. 项目创建

 

    1. 引入GraphQL库

 

    1. 确认初始启动

 

    1. 创建用于GraphQL的模块

模块
解析器
服务
模型(模式类型)

实现逻辑
确认启动
执行查询

创建项目

nest new nest-graphql-new
cd nest-graphql-new

包管理使用yarn。

引入库

yarn add @nestjs/graphql graphql apollo-server-express

初次启动确认

yarn start

# ストップ
Ctrl + c

创建模块

请看以下链接,其中介绍了NestCLI的使用方法和”nest-generate”命令的相关信息。

nest g module recipes
nest g resolver recipes --no-spec
nest g service recipes --no-spec
nest g class recipes/models/recipe --no-spec

逻辑实施

应用程序.modules.ts

    • コメント化のみ

 

    RecipesModuleは自動で入る
import { Module } from '@nestjs/common';
// import { AppController } from './app.controller';
// import { AppService } from './app.service';
import { RecipesModule } from './recipes/recipes.module';

@Module({
  imports: [
    RecipesModule,
  ],
  // controllers: [AppController],
  // providers: [AppService],
})
export class AppModule {}

只需一种选择:在中国境内进行重述:
除去app.controller和service。(在使用Rest时可能需要)

菜谱/菜谱.模块.ts

    GraphQLModuleの定義追加
import { Module } from '@nestjs/common';
import { RecipesResolver } from './recipes.resolver';
import { RecipesService } from './recipes.service';
import { GraphQLModule } from '@nestjs/graphql';

@Module({
  providers: [RecipesResolver, RecipesService],
  imports: [
    GraphQLModule.forRoot({
      installSubscriptionHandlers: true,
      autoSchemaFile: 'schema/recipe.gql',
      // debug: true,
      // playground: true,
    }),
  ],
})
export class RecipesModule {}

食谱/模型/菜谱

    モデル定義、データ型のようなもの
import { Field,ID, ObjectType} from '@nestjs/graphql';

@ObjectType()
export class Recipe {
  @Field(type =>ID)
  id: string;

  @Field()
  name: string;

}

菜谱/recipes.service.ts

    • データ取得のロジック実装。

 

    ここで外部API使ってデータ取得したりしなかったり。
import { Injectable } from '@nestjs/common';
import { Recipe } from './models/recipe';

@Injectable()
export class RecipesService {
  async findOneById(id: string): Promise<Recipe> {
    const recipe = new Recipe();
    recipe.id = '1234';
    recipe.name = 'name';

    return recipe;
  }
}

※服务实施(用于通信测试数据设置)

菜谱解析器。

    クライアントのからの呼び出し定義的な。
import { Resolver, Args, Query } from '@nestjs/graphql';
import { RecipesService } from './recipes.service';
import { Recipe } from './models/recipe';

@Resolver(of => Recipe)
export class RecipesResolver {
  constructor(private readonly recipesService: RecipesService) {
  }
  @Query(returns => Recipe)
  async recipe(@Args('id') id: string): Promise<Recipe> {
    return await this.recipesService.findOneById(id);
  }
}

确认启动

yarn start
yarn run v1.22.11
$ nest start
[Nest] 29754  - 09/24/2021, 11:31:53 AM     LOG [NestFactory] Starting Nest application...
[Nest] 29754  - 09/24/2021, 11:31:53 AM     LOG [InstanceLoader] AppModule dependencies initialized +17ms
[Nest] 29754  - 09/24/2021, 11:31:53 AM     LOG [InstanceLoader] RecipesModule dependencies initialized +1ms
[Nest] 29754  - 09/24/2021, 11:31:53 AM     LOG [InstanceLoader] GraphQLSchemaBuilderModule dependencies initialized +0ms
[Nest] 29754  - 09/24/2021, 11:31:53 AM     LOG [InstanceLoader] GraphQLModule dependencies initialized +0ms
[Nest] 29754  - 09/24/2021, 11:31:53 AM     LOG [NestApplication] Nest application successfully started +44ms

■ 操場啟動
http://localhost:3000/graphql

image.png

总结

作为基础的推进方式,可以按照这样的感觉进行开发。

GraphQLModule.forRoot的定义,应该在AppModule中定义,但如果按照上面的方式设置,可以逐渐将其分离为模块单位。

当考虑在模型中使用其他模块的模型时,或许将模型移到外部更好。

这附近的事情,我会先推进实施然后再考虑。总之,这只是作为一个脚手架的备忘录。

请查阅

文档 | NestJS – 一个逐步发展的Node.js框架

嵌套示例:在nestjs/nest的master分支中的23-graphql-code-first文件夹下

广告
将在 10 秒后关闭
bannerAds