🙄
NestJS入門~NestJSの基本構造を理解しよう~
はじめに
本記事は、NestJSというNode.jsのフレームワークの紹介となります。
対象読者にあたる方は、是非ご覧下さい!
認識誤っている箇所等あれば、コメントもいただけると嬉しいです!!
対象読者
- Node.jsでWeb APIたてたいと思ってる方
- NestJS触ってみたかったけど、まだ触ってない方
- なんか新しいフレームワーク学びたいなと思っている方
注意
- Node.js は10.13.0以上が必要です
What is NestJS
まずは、NestJSとはなんぞや、という話からです。
以下、公式ページより抜粋してみました。
- Node.js サーバーサイドアプリケーションを構築するためのフレームワーク
- TypeScriptをdefaultでサポート ( also supports pure Javascript)
- Expressをより抽象化したもの(Fastifyも使用可能)
Features
特徴も公式ページより抜粋しますね。
TypeScriptでかけて、アーキテクチャもしっかりしていて、拡張性が非常に高いんです!
- テストしやすい
- 拡張性高い
- 疎結合
- メンテしやすい
- アーキテクチャはAngularに強く影響
Hands On
ここからは実際にNestJSを触っていきましょう!
Installation
普段お使いのターミナルを開いて、まずはCLIのインストールです。
npm i -g @nestjs/cli
続いて適当なアプリを作成します。
# project-nameの部分を任意に指定
nest new project-name
サーバの起動
それではサーバを立ち上げましょう!
# project-nameは先ほど入力した文字列に変換ください
cd project-name
npm run start:dev
確認
http://localhost:3000/ にアクセスし、Hello worldが表示されていれば成功です!
基本構造
ここからは実際のソースコードを見ていきます。
NestJSを動かす上で重要なのが下記4つのファイルたちです。一つずつ見ていきましょう。
- main
- controller
- provider
- module
main.ts
- nestjsのエントリーポイント
- ここでサーバのインスタンスを作成し、listenする
async function bootstrap() {
// expressでいう const app = express();
// create()の引数にはルートモジュールクラスを指定する
const app = await NestFactory.create(AppModule);
// 3000番ポートでサーバの起動
await app.listen(3000);
}
bootstrap();
contoroller.ts
- ルーティングする場所
// @Controller()の引数にルーティングのパスを指定する
// @Controller()は '/'へのパス。 @Controller('todos')は '/todos' へのパス
@Controller()
export class AppController {
// service.tsで宣言したクラスをDIしてる。
constructor(private readonly appService: AppService) {}
// Getメソッドの場合はここでキャッチされる。
// @Get()の引数でもパス指定が可能。@Controller()で指定した後に続く部分のパスを指定する。
@Get()
// メソッド名はなんでも良い。
getHello(): string {
// 処理の内容はcontrollerには書かずにprovider(service.ts)に記述する。
return this.appService.getHello();
}
}
service.ts
- Nestjsでいうところのproviderのひとつ
- DI(依存関係を注入)するものを記述
// このデコレータでproviderとして認識される。
// そして、controllerのconstructorからDIされる。
@Injectable()
export class AppService {
// メソッド名はなんでも良い。controllerで指定した名前と違っても良い。(同じにした方がわかりやすい)
getHello(): string {
return 'Hello World!';
}
}
module.ts
- controllerとかproviderを取りまとめるところ(依存関係の解決)
- 必ず1つ以上のmodule.tsが必要(ルートモジュール)
// このアプリのルートモジュール
// importsの配列の中に他のmoduleを入れると別のmoduleをimportすることが可能。
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
その他便利なfeature
他にも強力な機能がたくさんあるので、いずれ紹介していきたいなと思ってます。
- Exception filters
- built-inで例外処理のレイヤーがある
- Pipes
- データの変換とvalidationが可能
- Guards
- 認可(authorization)
まとめ
以上、NestJSについて見ていきましたが、いかがでしたでしょうか。
まだ日本での活用事例が少ないせいか、日本語での情報が少ないのが現状です。
ですが、この記事をきっかけにNestJSユーザーが増えて、日本でのコミュニティが活発になれば良いなと思ってます。
最後まで読んでいただきありがとうございました!
サンプルコード
記事で紹介したコードの全体は下記よりご確認いただけます。
Discussion