Nestjs中不使用Mongoose的MongoDB与ElasticSearch健康检查实现咨询
NestJS MongoDB、ElasticSearch健康检查实现步骤
前置准备
首先安装Nest官方健康检查模块@nestjs/terminus:
npm install @nestjs/terminus @nestjs/axios axios # yarn 安装 yarn add @nestjs/terminus @nestjs/axios axios
模块配置
在你要挂载健康检查的模块(可以是AppModule,也可以单独新建HealthModule)中导入相关依赖,保留你原有MongoDB、ElasticSearch的配置无需修改:
import { Module } from '@nestjs/common'; import { TerminusModule } from '@nestjs/terminus'; import { HttpModule } from '@nestjs/axios'; import { HealthController } from './health.controller'; // 导入你项目原有MongoDB、ElasticSearch相关配置 import { ElasticsearchModule } from '@nestjs/elasticsearch'; import { MongoClient } from 'mongodb'; @Module({ imports: [ TerminusModule, HttpModule, // 你原有已经配置完成的ElasticsearchModule,直接复用即可 ElasticsearchModule.register({ node: 'http://你的ES地址:9200', // 原有认证、超时等配置全部保留 }), // 你原有注册的MongoDB连接提供者,这里假设注入token为MONGO_CLIENT { provide: 'MONGO_CLIENT', useFactory: async () => { const client = new MongoClient('你的MongoDB连接串'); await client.connect(); return client; }, } ], controllers: [HealthController], providers: [ // 全局注册MongoDB连接提供者,和你现有配置保持一致即可 { provide: 'MONGO_CLIENT', useFactory: async () => { const client = new MongoClient('你的MongoDB连接串'); await client.connect(); return client; }, } ] }) export class HealthModule {}
实现健康检查控制器
因为你没有使用Mongoose连接MongoDB,需要自定义MongoDB健康指示器,ElasticSearch可以直接使用Terminus内置的检查能力:
import { Controller, Get, Inject } from '@nestjs/common'; import { HealthCheck, HealthCheckService, ElasticsearchHealthIndicator, HealthIndicatorResult, HealthIndicator, } from '@nestjs/terminus'; import { MongoClient } from 'mongodb'; // 自定义MongoDB健康指示器 class MongoHealthIndicator extends HealthIndicator { constructor(@Inject('MONGO_CLIENT') private mongoClient: MongoClient) { super(); } async pingCheck(key: string): Promise<HealthIndicatorResult> { try { // 执行MongoDB ping命令验证连接有效性 await this.mongoClient.db().command({ ping: 1 }); return this.getStatus(key, true); } catch (err) { return this.getStatus(key, false, { errorMsg: err.message }); } } } @Controller('health') export class HealthController { constructor( private healthCheckService: HealthCheckService, private esHealthIndicator: ElasticsearchHealthIndicator, private mongoHealthIndicator: MongoHealthIndicator, ) {} @Get() @HealthCheck() runHealthCheck() { return this.healthCheckService.check([ // ElasticSearch健康检查,可传入第二个参数配置超时时间 () => this.esHealthIndicator.pingCheck('elasticsearch', { timeout: 1500 }), // MongoDB健康检查 () => this.mongoHealthIndicator.pingCheck('mongodb'), ]); } }
注意事项
- 替换代码中的
MONGO_CLIENT注入token为你项目中实际使用的MongoDB连接实例的注入标识,如果你还没有抽离MongoDB连接为全局提供者,直接将你现有代码中初始化完成的MongoClient实例传入健康指示器即可 - 健康检查接口默认返回规则:所有服务正常时返回200状态码,任意服务异常时返回503状态码,返回体中会明确标注异常的服务信息
- 如果你的ElasticSearch配置了认证、自定义路径等参数,只要原有
ElasticsearchModule配置正确,健康检查会自动复用配置,无需额外修改
内容的提问来源于stack exchange,提问作者Suraj Dalvi
相关产品推荐
相关产品推荐

