17
19

More than 3 years have passed since last update.

NestJS CLIで初心者でも簡単にNode.js REST APIが作れる!

Posted at

Node.jsなんてほとんど使ったことがないのに、頑張ってNestJSでCLIを使ってREST APIを作りました。
あまりドキュメントなかったことに加えて私のスキル不足で半日ほどかかってしまいましたが慣れれば30分もかからないです。

環境

Ubuntu18.04.01 LTSで動かしました。
NEST CLIのnest infoでバージョン情報を見ます。

$ nest info

 _   _             _      ___  _____  _____  _     _____
| \ | |           | |    |_  |/  ___|/  __ \| |   |_   _|
|  \| |  ___  ___ | |_     | |\ `--. | /  \/| |     | |
| . ` | / _ \/ __|| __|    | | `--. \| |    | |     | |
| |\  ||  __/\__ \| |_ /\__/ //\__/ /| \__/\| |_____| |_
\_| \_/ \___||___/ \__|\____/ \____/  \____/\_____/\___/


[System Information]
OS Version     : Linux 4.15
NodeJS Version : v12.14.1
NPM Version    : 6.13.4 

[Nest CLI]
Nest CLI Version : 6.14.2 

[Nest Platform Information]
platform-express version : 6.10.14
common version           : 6.10.14
core version             : 6.10.14

手順

NestJS 入門を参考にしました。作ったプログラムはGitHubに置いてあります。

1. プロジェクト作成

nest new <プロジェクト名>でプロジェクトを作ります。

$ nest new nest-test
⚡  We will scaffold your app in a few seconds..

CREATE /nest-test/.eslintrc.js (599 bytes)
CREATE /nest-test/.prettierrc (51 bytes)
CREATE /nest-test/README.md (3370 bytes)
CREATE /nest-test/nest-cli.json (64 bytes)
CREATE /nest-test/package.json (1877 bytes)
CREATE /nest-test/tsconfig.build.json (97 bytes)
CREATE /nest-test/tsconfig.json (336 bytes)
CREATE /nest-test/src/app.controller.spec.ts (617 bytes)
CREATE /nest-test/src/app.controller.ts (274 bytes)
CREATE /nest-test/src/app.module.ts (249 bytes)
CREATE /nest-test/src/app.service.ts (142 bytes)
CREATE /nest-test/src/main.ts (208 bytes)
CREATE /nest-test/test/app.e2e-spec.ts (630 bytes)
CREATE /nest-test/test/jest-e2e.json (183 bytes)

? Which package manager would you ❤️  to use? npm
✔ Installation in progress... ☕

🚀  Successfully created project nest-test
👉  Get started with the following commands:

$ cd nest-test
$ npm run start

2. プロジェクト作成確認

プロジェクト作成時の指示に従い、nodeを起動します。

$ cd nest-test
$ npm run start

起動したのでcurlで確かめてみます。"Hello World!"を取得できました。もちろんブラウザでアクセスしても同じ結果です。

$ curl http://localhost:3000
Hello World! 

3. Module作成

CLIからnest generate module <モジュール名>でModuleを生成。今回はModuleなどをすべてtestで統一しています。

nest generate module test
CREATE /src/test/test.module.ts (81 bytes)
UPDATE /src/app.module.ts (308 bytes)

4. Interface作成

CLIからnest generate interface <インターフェース名>でInterfaceを生成。インタフェースはフォルダ付きで"test/test"にしています。他と違うので気持ち悪いのですが、こんなものなのでしょうか。

nest generate interface test/test
CREATE /src/test/test.interface.ts (25 bytes)

生成されたtest.interface.tsを修正します。Interfaceに型を定義します。

test.interface.ts
export interface Test {
    id: string;
    name: string;
}

5. Service作成

CLIからnest generate service <サービス名>でServiceを生成。

$ nest generate service test
CREATE /src/test/test.service.spec.ts (446 bytes)
CREATE /src/test/test.service.ts (88 bytes)
UPDATE /src/test/test.module.ts (155 bytes)

手でtest.service.tsを修正します。複数のTestを出力する関数listTestとidを指定して単一のTestを返す関数getTestを定義します。

test.service.ts
import { Injectable } from '@nestjs/common';
import { Test } from './test.interface';

@Injectable()
export class TestService {
  private readonly test: Test[] = [{id: 'a', name: 'Alex'}, {id: 'b', name: 'Bob'}, {id: 'c', name: 'Cathy'}];

  listTest(): Test[] {
    return this.test;
  }

  getTest(id: string): Test {
    return this.test.find(value => value.id === id);
  }
}

6. Controller作成

CLIからnest generate controller <コントローラー名>でControllerを生成。

$ nest generate controller test
CREATE /src/test/test.controller.spec.ts (479 bytes)
CREATE /src/test/test.controller.ts (97 bytes)
UPDATE /src/test/test.module.ts (240 bytes)

test.controller.tsを修正。先ほどサービス内で定義した関数を呼び出します。
@Controller('test')とすることでパスtestにアクセスしたときに動作するようにしています。@Get()としたことでGETメソッドでアクセスしたときに動作します。@Get(':id')は、パスtestの配下に指定したidを受け取ります。

test.controller.ts
import { Controller, Get, Param } from '@nestjs/common';
import { TestService } from './test.service';
import { Test } from './test.interface';

@Controller('test')
export class TestController {
    constructor(private readonly testService: TestService) {}

    @Get()
    listUsers(): Test[] {
      return this.testService.listTest();
    }

    @Get(':id')
    getTest(@Param('id') id: string): Test {
      return this.testService.getTest(id);
    }      
}

7. 起動と確認

テストのためにnodeを起動。

nest start

curlで結果を確認します。無事、リスポンスを取得できました。

$ curl http://localhost:3000
Hello World

$ curl http://localhost:3000/test
[{"id":"a","name":"Alex"},{"id":"b","name":"Bob"},{"id":"c","name":"Cathy"}]

$ curl http://localhost:3000/test/a
{"id":"a","name":"Alex"}

8. ビルド

最後にnest builddistフォルダ配下にコードをビルドします。

nest build
17
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
19