🙄
NestJsのdocsをやってみる
はじめに
このnestjsのdocsを触りながらメモを残していく
殴り書きのメモなので悪しからず。
OVERVIEW
環境構築
nodeはインストール済みなのでプロジェクトを作るところから
npm i -g @nestjs/cli
nest new project-name
ファイル構造・概要
そもそも
npmで起動した時にmain.tsが明示していないのに呼ばれるのはnest-cli.jsonで"sourceRoot": "src",
が指定されているからっぽい。
main.tsのエントリーポイントになる関数がbootstrapという名前は慣習的なもので、自力で起動するという意味があるらしい。
設計モデル
MVCモデルという、プログラムを役割ごとにModel(モデル)・View(ビュー)・Controller(コントローラー)の3つに分けて管理するソフトウェア設計モデルを使っている。
- Model
- ビジネスロジックを担当。DBとの接続とか。
- View
- 表示や入出力などのユーザーインターフェースを担当。
- Controller
- ModelとViewの制御を担当。ユーザーとの繋ぎになる部分で、ModelやViewに指示を送る。テレビのリモコンと同じイメージ。
src
├── app.controller.spec.ts
├── app.controller.ts
├── app.module.ts
├── app.service.ts
└── main.ts
main.ts
エントリーポイント。
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
- NestFactoryはアプリのインスタンスを作るためのクラス。モジュールをapp化する。
- 作成したappをポート3000で公開。
- async/awaitについては非同期処理を調べること。
app.controller.ts
ルーティングを管理する
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
return this.appService.getHello();
}
}
- @Controllerというデコレーターの引数にパスを指定することで、ルーティングを設定できる。今回だと、ルートに設定される。
@Controller('hoge')
にするとlocalhost:3000/hoge
にパスが通る。 - constructorはクラスが作成される時に動くもので、引数にAppServiceをappServiceとして受け取り、インスタンス化している。
- AppServiceはprivate属性なので、AppControllerクラスの中からしか呼び出すことはできない。(安全)
- @GetはGETリクエストのときに動く関数。今回だとappService.getHelloを呼び出すようにしている。具体的なビジネスロジックはserviceに書かれる。
app.service.ts
ビジネスロジックが書かれる。
@Injectable()
export class AppService {
getHello(): string {
return 'Hello World!';
}
}
- @InjectableデコレーターはNestjsにおいて、クラス間の依存関係を解決するため(簡単に書くため)に使われる。これをDI(Dependency Injection)という。
app.module.ts
モジュール化を行い、依存関係を解決する
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
- ここではAppControllerとAppServiceをまとめてAppModuleとしてモジュール化している。
- importsに別のmoduleをかくことで使用することができる
- providers
- providerの意味の通り、色々機能を提供するものが入る。今回だと実際の処理を提供するServiceを指定している。
*.spec.ts
- テストコードが書かれている
Discussion