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

NestJSでデフォルトで出力するスタックトレースは、JavaScriptにトランスパイルされた後の位置が表示されます。
これを元のtsファイルの位置を表示するように変更する方法です。

## まずは通常のスタックトレース
まずは`nest new`して作成された`app.controller.ts`のgetHelloメソッド内でErrorをthrowするように修正しました。

```typescript: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');
  }
}
```

実行結果はこちらです。

```console:実行結果
$ 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というパッケージを利用します。

```console:
$ npm install source-map-support
```

### AppModuleでimport

次にAppModuleの中で`source-map-support/register`をimportします。

```typescript: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 {}
```

なんとこれだけです！！

### 実行してみる

さあ実行してみます。

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