Open10

NestJS

s0ars0ar

プロジェクト作成
任意のディレクトリで以下コマンド実行

❯ nest new nestjs-tutorial
❯ cd nestjs-tutorial
s0ars0ar

GraphQL関連パッケージ追加
https://github.com/s-0-a-r/nestjs-tutorial/pull/1/commits/b0eae7c331b9d41d584636bc9f7dfb372925e7d9

npm i @nestjs/graphql @nestjs/apollo graphql apollo-server-fastify

起動するはず

npm run start:dev

起動しなかった。

[Nest] 72068  - 12/09/2022, 3:39:56 PM   ERROR [PackageLoader] The "apollo-server-express" package is missing. Please, make sure to install this library ($ npm install apollo-server-express) to take advantage of GraphQLModule.

これをやらないとダメらしい
https://docs.nestjs.com/techniques/performance#installation

やったら起動した。
(まだスキーマが一切定義されていないのでエラーは吐く)

s0ars0ar

https://docs.nestjs.com/graphql/quick-start#code-first
Code Firstでいく

とりあえずresourceを一式作る。

❯ npx nest g --help
Usage: nest generate|g [options] <schematic> [name] [path]

Generate a Nest element.
  Schematics available on @nestjs/schematics collection:
    ┌───────────────┬─────────────┬──────────────────────────────────────────────┐
    │ name          │ alias       │ description                                  │
    │ application   │ application │ Generate a new application workspace         │
    │ class         │ cl          │ Generate a new class                         │
    │ configuration │ config      │ Generate a CLI configuration file            │
    │ controller    │ co          │ Generate a controller declaration            │
    │ decorator     │ d           │ Generate a custom decorator                  │
    │ filter        │ f           │ Generate a filter declaration                │
    │ gateway       │ ga          │ Generate a gateway declaration               │
    │ guard         │ gu          │ Generate a guard declaration                 │
    │ interceptor   │ itc         │ Generate an interceptor declaration          │
    │ interface     │ itf         │ Generate an interface                        │
    │ middleware    │ mi          │ Generate a middleware declaration            │
    │ module        │ mo          │ Generate a module declaration                │
    │ pipe          │ pi          │ Generate a pipe declaration                  │
    │ provider      │ pr          │ Generate a provider declaration              │
    │ resolver      │ r           │ Generate a GraphQL resolver declaration      │
    │ service       │ s           │ Generate a service declaration               │
    │ library       │ lib         │ Generate a new library within a monorepo     │
    │ sub-app       │ app         │ Generate a new application within a monorepo │
    │ resource      │ res         │ Generate a new CRUD resource                 │
    └───────────────┴─────────────┴──────────────────────────────────────────────┘

Options:
  -d, --dry-run                      Report actions that would be taken without writing out results.
  -p, --project [project]            Project in which to generate files.
  --flat                             Enforce flat structure of generated element.
  --no-flat                          Enforce that directories are generated.
  --spec                             Enforce spec files generation. (default: true)
  --skip-import                      Skip importing (default: false)
  --no-spec                          Disable spec files generation.
  -c, --collection [collectionName]  Schematics collection to use.
  -h, --help                         Output usage information.

resで一式できる。コマンド実行するとRESTなのかGraphQLなのかとかCRUDのentrypoint作るのかとか聞いてくるから以下のようにした。

❯ npx nest g res modules/events
? What transport layer do you use? GraphQL (code first)
? Would you like to generate CRUD entry points? Yes
CREATE src/modules/events/events.module.ts (217 bytes)
CREATE src/modules/events/events.resolver.spec.ts (515 bytes)
CREATE src/modules/events/events.resolver.ts (1098 bytes)
CREATE src/modules/events/events.service.spec.ts (446 bytes)
CREATE src/modules/events/events.service.ts (623 bytes)
CREATE src/modules/events/dto/create-event.input.ts (196 bytes)
CREATE src/modules/events/dto/update-event.input.ts (243 bytes)
CREATE src/modules/events/entities/event.entity.ts (187 bytes)
UPDATE src/app.module.ts (704 bytes)
s0ars0ar

なんか簡易的なスケジュール調整サービス的なサムシングをつくる
(ちゃんとはつくらない)
ユーザーがいてイベントがあってスケジュールがある感じ
データ構造とかは雑。
UserとEventとScheduleを作った。

s0ars0ar

NestJS v9でFastifyを選ぶとFastify v4がインストールされるようなんだけど、
apollo-server-fastifyがv3までしか対応してないみたいで、起動時にエラーが発生する。
なのでとりあえずNestJS v8で茶を濁す。
(べつにExpressでも良いんだけどね)
https://github.com/nestjs/graphql/issues/2307

s0ars0ar

肉付けしていく

type Event {
  id: Int!
  name: String!
  description: String
}

type Schedule {
  id: Int!
  startAt: DateTime!
  endAt: DateTime!
}

type User {
  id: Int!
  name: String!
  comment: String
}

出欠管理のためのデータが足りないことに気づいたので追加

type Attendance {
  id: Int!
  status: Int
}

DBつくる