【NestJS】pingで呼び出すとpongを返すWeb APIを作成する

Node.jsのWebフレームワークである「NestJS」を用いることで、
pingで呼び出すとpongを返すWeb APIを作成します。

方針

以下のようなディレクトリ構成に変更します。

変更前変更後
src/main.tssrc/main.ts
src/app.module.tssrc/app.module.ts
なしsrc/ping/module/ping.module.ts
src/app.controller.tssrc/ping/controller/ping.controller.ts
src/app.service.tssrc/ping/service/ping.service.ts
src/app.controller.spec.tssrc/ping/test/ping.controller.spec.ts
test/app.e2e-spec.tstest/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

参考

タイトルとURLをコピーしました