You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 02:06:03