Skip to content

コントローラーは受信した HTTP リクエストを処理してレスポンスを返します。@Controller() でデコレートされ、HTTP メソッドデコレータでルートを定義します。

コントローラーの定義

typescript
import { Controller, Get } from "nestelia";

@Controller("/cats")
class CatController {
  @Get("/")
  findAll() {
    return [{ name: "Tom" }, { name: "Garfield" }];
  }
}

@Controller("/cats") デコレータはルートプレフィックスを設定します。@Get("/") デコレータは GET /cats/findAll() にマッピングします。

コントローラーの登録

コントローラーはモジュールで宣言する必要があります:

typescript
@Module({
  controllers: [CatController],
  providers: [CatService],
})
class CatModule {}

サービスのインジェクト

コンストラクタで @Inject() を使って DI コンテナからサービスにアクセスします:

typescript
@Controller("/cats")
class CatController {
  constructor(@Inject(CatService) private readonly catService: CatService) {}

  @Get("/")
  findAll() {
    return this.catService.findAll();
  }
}

ルートメソッド

nestelia はすべての標準 HTTP メソッドに対応するデコレータを提供します:

typescript
@Controller("/items")
class ItemController {
  @Get("/")       findAll() { /* ... */ }
  @Get("/:id")    findOne() { /* ... */ }
  @Post("/")      create()  { /* ... */ }
  @Put("/:id")    update()  { /* ... */ }
  @Patch("/:id")  patch()   { /* ... */ }
  @Delete("/:id") remove()  { /* ... */ }
  @Options("/")   options() { /* ... */ }
  @Head("/")      head()    { /* ... */ }
  @All("/wild")   any()     { /* ... */ }
}

レスポンスの返し方

コントローラーメソッドは以下を返せます:

  • プレーンオブジェクト / 配列 — 自動的に JSON にシリアライズ
  • 文字列 — プレーンテキストとして返される
  • Promise — await してシリアライズ
typescript
@Get("/")
async findAll() {
  const users = await this.userService.findAll();
  return users; // JSON にシリアライズ
}

リクエストデータへのアクセス

@Ctx() を使って Elysia のフルコンテキストを取得し、すべてのリクエストデータにアクセスします:

typescript
@Get("/:id")
findOne(@Ctx() ctx: any) {
  const id = ctx.params.id;
  const q = ctx.query.q;
  return this.service.findById(id);
}

body、params、query への型付きかつバリデーション済みのアクセスには TypeBox ベースのデコレータを使用します:

typescript
import { t } from "elysia";

@Post("/")
create(@Body(t.Object({ name: t.String() })) body: { name: string }) {
  return this.userService.create(body);
}

詳細はパラメータデコレータを参照してください。

ステータスコードの設定

@HttpCode() を使ってルートのカスタムステータスコードを設定します:

typescript
@Post("/")
@HttpCode(201)
create(@Body(t.Object({ name: t.String() })) body: { name: string }) {
  return this.userService.create(body);
}

動的なステータスコードには Elysia コンテキストを使用します:

typescript
@Post("/")
create(@Ctx() ctx: any, @Body(t.Object({ name: t.String() })) body: { name: string }) {
  ctx.set.status = 201;
  return this.userService.create(body);
}

レスポンスヘッダーの設定

@Header() を使って静的なレスポンスヘッダーを追加します:

typescript
@Get("/")
@Header("Cache-Control", "no-store")
findAll() {
  return this.service.findAll();
}

MIT ライセンスの下で公開されています。