Open16

NestJSについて🌟

ピン留めされたアイテム
まさぴょんまさぴょん

NestJS の概要

  • NestJSの特徴や哲学について、公式の説明から引用する。

https://github.com/nestjs/nest

説明

  • Nest は、効率的でスケーラブルなNode.jsサーバー側アプリケーションを構築するためのフレームワークです。
  • 最新の JavaScript を仕様しており、次のような要素を組み合わせて作成されています。
    • TypeScriptで構築(純粋な JavaScript との互換性を維持)
    • OOP (オブジェクト指向プログラミング)
    • FP (関数型プログラミング)、および FRP (関数型リアクティブ プログラミング)
  • Nest は内部的にExpressを利用しますが、 Fastifyなどの他の幅広いライブラリとの互換性も提供し、利用可能な無数のサードパーティ・プラグインを簡単に使用できるようにします。

哲学

  • 近年、Node.js のおかげで、JavaScript はフロントエンド アプリケーションとバックエンド アプリケーションの両方にとって Web の「共通語」となっています。
  • フロントエンド アプリケーションに関しては、Angular、React、Vueなどの素晴らしいプロジェクトを生み出し、開発者の生産性を向上させ、高速、テスト可能、拡張可能です。
  • ただし、サーバー側には、Node 用の優れたライブラリ、ヘルパー、ツールがたくさんありますが、主要な問題であるアーキテクチャを効果的に解決できるものはありません。
  • NestJSは、高度にテスト可能でスケーラブルで、疎結合で保守が容易なアプリケーションを簡単に作成できます。
    • NestJSは、すぐに使えるアプリケーション アーキテクチャを提供することを目指しています。
    • このアーキテクチャは Angular から多大な影響を受けています。

参考・引用

https://github.com/nestjs/nest

https://docs.nestjs.com/

まさぴょんまさぴょん

Docker でサクッとNestJS 環境構築 (NestJS ✖️ PostgreSQL ✖️ TypeORM)

  • NestJS でBackEnd環境を構築する
  • NestJS ✖️ PostgreSQL ✖️ TypeORM

NestJS 環境構築の基本形

1. Nest CLI をインストール

  • local に NestJS CLI が Install されていない場合は、まずは CLI を install しましょう。
npm install -g @nestjs/cli

2. プロジェクトの作成

nest new --strict .

🙀 Packages installation failed!エラーに遭遇。。。

nest new --strict .で新規プロジェクトを作成中に、🙀 Packages installation failed!エラーに遭遇。。。

app % nest new --strict .
⚡  We will scaffold your app in a few seconds..

? Which package manager would you ❤️  to use? yarn
CREATE .eslintrc.js (663 bytes)
CREATE .prettierrc (51 bytes)
CREATE README.md (3347 bytes)
CREATE nest-cli.json (171 bytes)
CREATE package.json (1942 bytes)
CREATE tsconfig.build.json (97 bytes)
CREATE tsconfig.json (541 bytes)
CREATE src/app.controller.ts (274 bytes)
CREATE src/app.module.ts (249 bytes)
CREATE src/app.service.ts (142 bytes)
CREATE src/main.ts (208 bytes)
CREATE test/jest-e2e.json (183 bytes)
CREATE src/app.controller.spec.ts (617 bytes)
CREATE test/app.e2e-spec.ts (630 bytes)

▹▹▹▹▹ Installation in progress... ☕
Failed to execute command: yarn install --silent
✖ Installation in progress... ☕
🙀  Packages installation failed!
In case you don't see any errors above, consider manually running the failed command yarn install to see more details on why it errored out.
                                         
                          Thanks for installing Nest 🙏
                 Please consider donating to our open collective
                        to help us maintain this package.
                                         
                                         
               🍷  Donate: https://opencollective.com/nest

とあるので、yarn installを実行してみる。。。

app % yarn install
yarn install v1.22.19
info No lockfile found.
[1/4] 🔍  Resolving packages...
warning @nestjs/cli > fork-ts-checker-webpack-plugin > memfs@3.6.0: this will be v4
[2/4] 🚚  Fetching packages...
error @angular-devkit/core@17.1.2: The engine "node" is incompatible with this module. Expected version "^18.13.0 || >=20.9.0". Got "16.15.1"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

Nodeのバージョンエラーであることが判明!

Nodeのバージョンをv18.18.0に変更して解決🙆‍♂️

app % nodebrew ls
v16.15.1
v18.4.0
v18.12.0
v18.18.0

current: v16.15.1

app % nodebrew use v18.18.0
use v18.18.0

https://qiita.com/tomy0610/items/6e5c6e67863684b6a9c0

参考・引用

https://zenn.dev/bloomer/articles/335e2d7c26ac86

https://zenn.dev/optimisuke/articles/17ee6aba316e47

https://qiita.com/yasdtech/items/31c9ea7553bd4ddbd9bc

https://note.com/rect_angle/n/ncdfe89e656b3

https://migisanblog.com/nestjs-docker-setup/

https://qiita.com/yuuri23/items/6bfe9bb11727a80d12fd

https://tech-lab.sios.jp/archives/38639

https://qiita.com/tomy0610/items/6e5c6e67863684b6a9c0

まさぴょんまさぴょん

NestJS プロジェクトのDefault設定 Ver. package.json

  • nest new --strict .で新規作成したプロジェクトのpackage.jsonファイルの設定
package.json
{
  "name": "app",
  "version": "0.0.1",
  "description": "",
  "author": "",
  "private": true,
  "license": "UNLICENSED",
  "scripts": {
    "build": "nest build",
    "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
    "start": "nest start",
    "start:dev": "nest start --watch",
    "start:debug": "nest start --debug --watch",
    "start:prod": "node dist/main",
    "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage",
    "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
    "test:e2e": "jest --config ./test/jest-e2e.json"
  },
  "dependencies": {
    "@nestjs/common": "^10.0.0",
    "@nestjs/core": "^10.0.0",
    "@nestjs/platform-express": "^10.0.0",
    "reflect-metadata": "^0.2.0",
    "rxjs": "^7.8.1"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.0.0",
    "@nestjs/schematics": "^10.0.0",
    "@nestjs/testing": "^10.0.0",
    "@types/express": "^4.17.17",
    "@types/jest": "^29.5.2",
    "@types/node": "^20.3.1",
    "@types/supertest": "^6.0.0",
    "@typescript-eslint/eslint-plugin": "^6.0.0",
    "@typescript-eslint/parser": "^6.0.0",
    "eslint": "^8.42.0",
    "eslint-config-prettier": "^9.0.0",
    "eslint-plugin-prettier": "^5.0.0",
    "jest": "^29.5.0",
    "prettier": "^3.0.0",
    "source-map-support": "^0.5.21",
    "supertest": "^6.3.3",
    "ts-jest": "^29.1.0",
    "ts-loader": "^9.4.3",
    "ts-node": "^10.9.1",
    "tsconfig-paths": "^4.2.0",
    "typescript": "^5.1.3"
  },
  "jest": {
    "moduleFileExtensions": [
      "js",
      "json",
      "ts"
    ],
    "rootDir": "src",
    "testRegex": ".*\\.spec\\.ts$",
    "transform": {
      "^.+\\.(t|j)s$": "ts-jest"
    },
    "collectCoverageFrom": [
      "**/*.(t|j)s"
    ],
    "coverageDirectory": "../coverage",
    "testEnvironment": "node"
  }
}
まさぴょんまさぴょん

NestJS 系をカスタムする🌟

NestJSは簡単に言えば、Express同様にNode.jsのフレームワークである。主な特徴は以下の通り。

  • デフォルトでTypeScriptが使える
  • Expressの知識をそのまま応用できる
  • OOP(オブジェクト指向プログラミング)、FP(関数型プログラミング)、FRP(関数型リアクティブプログラミング)の要素をフル活用できる
  • テストが簡単。専用のテストフレームワークが用意されている
  • 設計思想がAngularに影響されている
  • GraphQLとREST APIの開発を両方ともサポートしている
  • マイクロサービスを開発しやすい
  • WebSocketと連携できる
  • 拡張性が高い
  • コマンド一つで開発に必要な機能がデフォルトで揃っている
  • 日本語に対応していないものの、公式ドキュメントが非常にわかりやすく丁寧に書かれており初心者でもスムーズに習得できるのが最大の魅力である。

https://zenn.dev/nameless_sn/articles/swagger_tutorial_for_ts

https://zenn.dev/nameless_sn/articles/nestjs_restapi_by_prisma

https://zenn.dev/nameless_sn/articles/nestjs_user-auth_tutorial

まさぴょんまさぴょん

NestJS と Express の比較

NestJSは、Node.jsのためのフレームワークであり、サーバーサイドのアプリケーション開発を容易にすることを目的としています。
TypeScriptで書かれており、効率的かつスケーラブルなアプリケーションの構築を支援します。
NestJSは、デザインパターンとして依存性注入を採用しており、モジュール性、再利用性、テストのしやすさを重視しています。

一方、ExpressはNode.jsのミニマルなフレームワークであり、Webアプリケーションの基本的な機能を提供します。
シンプルさと柔軟性が魅力で、開発者は中間件やルーティングの設定など、必要な機能を自由に追加できます。

NestJSとExpressの主な違いは、
NestJSがフルスタックフレームワークとしてより多くの機能を備え、アプリケーションアーキテクチャに一定の構造を提供することです。
一方で、Expressはよりベーシックで、開発者により多くの自由度を提供しますが、大規模なアプリケーションでは構造と整理が必要になる場合があります。

参考・引用

https://qiita.com/elipmoc101/items/9b1e6b3efa62f3c2a166

https://zenn.dev/yimajo/scraps/5af4ffa0103b41

https://task-kawahara.hatenablog.com/entry/2019/12/05/000000

https://techtionary.jp/3534/

https://one-div.com/programming/type-script/what_is_nestjs

まさぴょんまさぴょん

NestJS ハンズオン講座🌟

NestJS プロジェクトを作成する

  • NestJS CLI を Global Install します。
npm i -g @nestjs/cli
  • プロジェクトを作成する
 nest new nestjs-example

TypeORMのセットアップ

TypeORM の install

npm install --save @nestjs/typeorm typeorm mysql2

# または。。。

yarn add @nestjs/typeorm typeorm mysql2

データベースとの接続で使用する環境変数

  • データベースに接続するために必要な情報は、環境変数でアプリケーションに渡します。
  • NestJSで環境変数を取得するライブラリとして、@nestjs/configを使用します。
yarn add @nestjs/config
  • config/configuration.tsを作成する
config/configuration.ts
export default () => ({
  database: {
    host: process.env.DATABASE_HOST || 'localhost',
    port: parseInt(process.env.DATABASE_PORT, 10) || 3306,
    username: process.env.DATABASE_USER || 'test',
    password: process.env.password || 'password',
    name: process.env.database || 'test',
  },
});

参考・引用

https://en-ambi.com/itcontents/entry/2023/02/17/093000/

https://github.com/NaokiHaba/nestjs-example