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",
]
}
