LoginSignup
5
3

More than 3 years have passed since last update.

NestJSでtsファイルの位置をスタックトレースに表示する方法

Posted at

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であれば実現できるので是非利用してみてください。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3