我們先讓 Task 可以跟 gateway 接上
User 跟 Message 可以晚點跟上,因為做法都一樣
先在 Task 加上 federation 的 dependency
$ npm install --save @apollo/federation
or
$ yarn add @apollo/federation
將 Task 的 app.module.ts 更改,改為 GraphQLFederationModule
import { Module } from '@nestjs/common';
// 引入 GraphQLModule
import { GraphQLFederationModule } from '@nestjs/graphql';
import { TasksModule } from './tasks/tasks.module';
import { MongooseModule } from '@nestjs/mongoose';
import { join } from 'path';
@Module({
imports: [
MongooseModule.forRoot('mongodb://root:test@localhost:27012/admin'),
GraphQLFederationModule.forRoot({
autoSchemaFile: join(__dirname, 'src/schema.gql'),
}),
TasksModule
],
})
export class AppModule {}
更改 Task 的 port,可以由讀者自行決定,我這邊更改為 4002 ,原本的 4000 會讓 gateway 使用
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
declare const module: any;
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(4002);
if (module.hot) {
module.hot.accept();
module.hot.dispose(() => app.close());
}
}
bootstrap();
接著使用 nestjs 提供的指令,建立一個 gateway
$ nest new gateway
安裝需要的套件
$ yarn add @nestjs/graphql @apollo/gateway apollo-server-express
設定 gateway 的 service list
import { Module } from '@nestjs/common';
import { GraphQLGatewayModule } from '@nestjs/graphql';
@Module({
imports: [
GraphQLGatewayModule.forRootAsync({
useFactory: async () => ({
gateway: {
serviceList: [
{ name: 'task', url: 'http://localhost:4002/graphql' }
],
}
})
}),
]
})
export class AppModule {}
以上是基本的 gateway 設定,接下來會講解如何實際使用