使用NestJS进行GraphQL模块开发
首先
这是我根据自己的理解所记录的备忘录,说明了如何进行制作。
如果是进行追加开发之类的话,应该按照步骤进行4及之后的操作,或者直接复制粘贴以便重复利用。
※如何处理共通化部分是个问题。
环境
"@nestjs/common": "^8.0.0",
"@nestjs/core": "^8.0.0",
"@nestjs/graphql": "^9.0.4",
"@nestjs/cli": "^8.0.0",
整体的趋势
-
- 项目创建
-
- 引入GraphQL库
-
- 确认初始启动
-
- 创建用于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
总结
作为基础的推进方式,可以按照这样的感觉进行开发。
GraphQLModule.forRoot的定义,应该在AppModule中定义,但如果按照上面的方式设置,可以逐渐将其分离为模块单位。
当考虑在模型中使用其他模块的模型时,或许将模型移到外部更好。
这附近的事情,我会先推进实施然后再考虑。总之,这只是作为一个脚手架的备忘录。
请查阅
文档 | NestJS – 一个逐步发展的Node.js框架
嵌套示例:在nestjs/nest的master分支中的23-graphql-code-first文件夹下