NestJSでデフォルトで出力するスタックトレースは、JavaScriptにトランスパイルされた後の位置が表示されます。
これを元のtsファイルの位置を表示するように変更する方法です。
まずは通常のスタックトレース
まずはnest new
して作成されたapp.controller.ts
のgetHelloメソッド内でErrorをthrowするように修正しました。
src/app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
@Get()
getHello(): string {
throw new Error('example error');
}
}
実行結果はこちらです。
実行結果
$ curl localhost:3000/
{"statusCode":500,"message":"Internal server error"}
[Nest] 4206 - 2020-03-07 15:44:25 [ExceptionsHandler] example error +706ms
Error: example error
at AppController.getHello (/Users/ysaito/dev/app/nest/nest-microservice/test-project/dist/app.controller.js:19:15)
at /Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/@nestjs/core/router/router-execution-context.js:37:29
at InterceptorsConsumer.intercept (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/@nestjs/core/interceptors/interceptors-consumer.js:10:20)
at /Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/@nestjs/core/router/router-execution-context.js:45:60
at /Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/@nestjs/core/router/router-proxy.js:8:23
at Layer.handle [as handle_request] (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/layer.js:95:5)
at /Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/index.js:281:22
上記の通り、app.controller.js
ファイルの内容が出力されているため、実際のコードと位置が多少変わってしまっています。
tsファイルでスタックトレース出力
さて本題に入っていきましょう。
Source Map Supportをインストール
Source Map Supportというパッケージを利用します。
$ npm install source-map-support
AppModuleでimport
次にAppModuleの中でsource-map-support/register
をimportします。
src/app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import 'source-map-support/register';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
なんとこれだけです!!
実行してみる
さあ実行してみます。
$ curl localhost:3000/
{"statusCode":500,"message":"Internal server error"}
Error: example error
at AppController.getHello (/Users/ysaito/dev/app/nest/nest-microservice/test-project/src/app.controller.ts:10:11)
at /Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/@nestjs/core/router/router-execution-context.js:37:29
at InterceptorsConsumer.intercept (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/@nestjs/core/interceptors/interceptors-consumer.js:10:20)
at /Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/@nestjs/core/router/router-execution-context.js:45:60
at /Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/@nestjs/core/router/router-proxy.js:8:23
at Layer.handle [as handle_request] (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/layer.js:95:5)
at /Users/ysaito/dev/app/nest/nest-microservice/test-project/node_modules/express/lib/router/index.js:281:22
はい!たったのこれだけでtsファイルのの位置をスタックトレースに表示することができました!
今回はNestJSで実行しましたが、普通にTypeScriptであれば実現できるので是非利用してみてください。