やりたいこと
NestJS x TypeORM の環境で、DBまで一気通貫したヘルスチェック用URLを作りたい。
terminusというNodeJS用のパッケージで、NestJS用のものがあるので、それを使います。
環境
インストール
yarn add @nestjs/terminus @godaddy/terminus --no-optional
// or
npm install --save @nestjs/terminus @godaddy/terminus --no-optional
参照: https://github.com/nestjs/terminus#installation
実装
ほとんど、↓のページに書いている通りです。
- https://github.com/nestjs/terminus#usage
- ↑との違いは、
async (): Promise<HealthIndicatorResult>
として、戻り値の型を定義しているぐらいです。
src/health/health.module.ts
に置いていますが、場所は任意です。
src/health/health.module.ts
import{TYPE_ORM_CONFIG}from'../config/app.config'import{Module}from'@nestjs/common'import{TerminusModule,TerminusModuleOptions,TypeOrmHealthIndicator,HealthIndicatorResult,}from'@nestjs/terminus'import{TypeOrmModule}from'@nestjs/typeorm'constgetTerminusOptions=(db:TypeOrmHealthIndicator):TerminusModuleOptions=>({endpoints:[{url:'/health',healthIndicators:[// Set the timeout for a response to 300msasync():Promise<HealthIndicatorResult>=>db.pingCheck('database',{timeout:300}),],},],})@Module({imports:[TypeOrmModule.forRoot(TYPE_ORM_CONFIG),TerminusModule.forRootAsync({inject:[TypeOrmHealthIndicator],useFactory:(db)=>getTerminusOptions(db),}),],})exportclassHealthModule{}
src/app.module.ts
でimports
に追加します。
src/app.module.ts
import{HealthModule}from'./health/health.module'// この行と、、、imports:[TypeOrmModule.forRoot(TYPE_ORM_CONFIG),HealthModule,// この行を追加
前提
↑の前提として、TYPE_ORM_CONFIG
(config/app.config
)に、DBの定義情報が設定されている必要があります。以下、例です。
src/config/app.config.ts
import{TypeOrmModuleOptions}from'@nestjs/typeorm'exportconstTYPE_ORM_CONFIG:TypeOrmModuleOptions={type:'mysql',charset:'utf8mb4_bin',host:process.env.DB_HOST||'localhost',port:+(process.env.DB_PORT||3306),username:process.env.DB_USERNAME||'root',password:process.env.DB_PASSWORD,database:process.env.DB_DATABASE||'your_database_name_comes_here',entities:[__dirname+'/../**/*.entity.{js,ts}'],}
動作確認ログ
$ curl -X GET "http://localhost:3000/health"
{"status":"ok","info":{"database":{"status":"up"}},"details":{"database":{"status":"up"}}}%
// DBに対して SELECT 1 が実行されていることが確認できます。
$ yarn start:dev
:
{"level":30,"time":1581485016754,"pid":62278,"hostname":"xl.local","msg":"Server listening at http://0.0.0.0:3000","v":1}
query: SELECT 1