ウェブサイト検索

node.js - Nestjsで、すべてのモジュールおよびモジュールごとに利用可能なすべてのコントローラーから、すべてのルートを取得するにはどうすればよいですか?


Nestjsを使用して、次のようにHTTP動詞付きで利用可能なすべてのルート(コントローラーメソッド)のリストを取得したいです:

API:
      POST   /api/v1/user
      GET    /api/v1/user
      PUT    /api/v1/user

Expressルーターへのアクセスが必要なようですが、Nestjsでこれを行う方法はまだ見つかっていません。Expressの場合、"express-list-routes" や "express-list-endpoints" のようなライブラリがあります。

よろしくお願いします!

回答 #1

main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
  const server = app.getHttpAdapter().getInstance();
  const router = server.router;

  const availableRoutes: [] = router.stack
    .map(layer => {
      if (layer.route) {
        return {
          route: {
            path: layer.route?.path,
            method: layer.route?.stack[0].method,
          },
        };
      }
    })
    .filter(item => item !== undefined);
  console.log(availableRoutes);
}
bootstrap();

回答 #2

私はちょうど、Nestjs アプリには "getHttpServer()" メソッドがあることを見つけました。これを使って "router stack" にアクセスすることができました。こちらがその解決策です:

// main.ts

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import * as expressListRoutes from 'express-list-routes';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableCors();
  await app.listen(3000);


  const server = app.getHttpServer();
  const router = server._events.request._router;
  console.log(expressListRoutes({}, 'API:', router));

}
bootstrap();

回答 #3

import { Controller, Get, Request } from "@nestjs/common";
import { Request as ExpressRequest, Router } from "express";

...

@Get()
root(@Request() req: ExpressRequest) {
    const router = req.app._router as Router;
    return {
        routes: router.stack
            .map(layer => {
                if(layer.route) {
                    const path = layer.route?.path;
                    const method = layer.route?.stack[0].method;
                    return `${method.toUpperCase()} ${path}`
                }
            })
            .filter(item => item !== undefined)
    }
}

...
{
    "routes": [
        "GET /",
        "GET /users",
        "POST /users",
        "GET /users/:id",
        "PUT /users/:id",
        "DELETE /users/:id",
    ]
}

関連記事