Node.jsのWebフレームワークである「NestJS」を用いることで、
pingで呼び出すとpongを返すWeb APIを作成します。
方針
以下のようなディレクトリ構成に変更します。
変更前 | 変更後 |
src/main.ts | src/main.ts |
src/app.module.ts | src/app.module.ts |
なし | src/ping/module/ping.module.ts |
src/app.controller.ts | src/ping/controller/ping.controller.ts |
src/app.service.ts | src/ping/service/ping.service.ts |
src/app.controller.spec.ts | src/ping/test/ping.controller.spec.ts |
test/app.e2e-spec.ts | test/ping/ping.e2e-spec.ts |
手順
以下のコマンドで、必要なパッケージをインストールする。
npm install -g @nestjs/cli
以下のコマンドで、プロジェクトを作成する。
ここでは、「ping-api」というプロジェクトを作成する。
nest new ping-api
src/main.tsを以下のように編集する。
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();
src/app.module.tsを以下のように編集する。
import { Module } from '@nestjs/common';
import { PingModule } from './ping/module/ping.module';
@Module({
imports: [PingModule],
controllers: [],
providers: [],
})
export class AppModule {}
src/ping/module/ping.module.tsを作成し、以下のように編集する。
import { Module } from '@nestjs/common';
import { PingController } from '../controller/ping.controller';
import { PingService } from '../service/ping.service';
@Module({
imports: [],
controllers: [PingController],
providers: [PingService],
})
export class PingModule {}
src/app.controller.tsをsrc/ping/controller/ping.controller.tsに変更し、
以下のように編集する。
import { Controller, Get } from '@nestjs/common';
import { PingService } from '../service/ping.service';
@Controller('ping')
export class PingController {
constructor(private readonly pingService: PingService) {}
@Get()
ping(): string {
return this.pingService.ping();
}
}
src/app.service.tsをsrc/ping/service/ping.service.tsに変更し、
以下のように編集する。
import { Injectable } from '@nestjs/common';
@Injectable()
export class PingService {
ping(): string {
return 'pong';
}
}
src/app.controller.spec.tsをsrc/ping/test/controller/ping.controller.spec.tsに変更し、
以下のように編集する。
import { Test, TestingModule } from '@nestjs/testing';
import { PingController } from '../controller/ping.controller';
import { PingService } from '../service/ping.service';
describe('PingController', () => {
let pingController: PingController;
beforeEach(async () => {
const app: TestingModule = await Test.createTestingModule({
controllers: [PingController],
providers: [PingService],
}).compile();
pingController = app.get<PingController>(PingController);
});
describe('/ping', () => {
test('pongという文字列を返す', () => {
expect(pingController.ping()).toBe('pong');
});
});
});
test/app.e2e-spec.tsをtest/ping/ping.e2e-spec.tsに変更し、
以下のように編集する。
import { Test, TestingModule } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import * as request from 'supertest';
import { AppModule } from '../../src/app.module';
describe('PingController', () => {
let app: INestApplication;
beforeEach(async () => {
const moduleFixture: TestingModule = await Test.createTestingModule({
imports: [AppModule],
}).compile();
app = moduleFixture.createNestApplication();
await app.init();
});
test('GET /ping', () => {
return request(app.getHttpServer()).get('/ping').expect(200).expect('pong');
});
});
以下のコマンドを実行すると、コンソールに「Starting Nest application…」などが出力され、
クライアントから http://localhost:3000/ping にGETリクエストを送信すると
サーバーから「pong」というテキストを含むステータスコード200のレスポンスが返される。
npm run start
参考
- Documentation | NestJS – A progressive Node.js framework
https://docs.nestjs.com/