NestJS:如何获取猫鼬的实例进行健康检查?

Ram*_*ngh 2 mongoose mongodb node.js nestjs

我正在使用 @nestjs/mongoose 包连接到 Mongo DB。我在 app.module.ts 中有这个:

imports: [
   MongooseModule.forRoot(process.env.MONGODB_URI, {
      useNewUrlParser: true,
      bufferCommands: false,
      bufferMaxEntries: 0,
      useCreateIndex: true,
      useFindAndModify: false,
      useUnifiedTopology: true
})]
Run Code Online (Sandbox Code Playgroud)

现在,NestJS 服务在 Kubernetes 集群中运行,并进行了适当的健康、活跃度和就绪检查。每当在服务上调用就绪或运行状况端点时,我需要检查托管的 Atlas Mongo DB 连接是否可用或是否发生中断。截至目前,为就绪和健康端点执行以下代码:

this.mongoDbConnection = await mongoose.connect(process.env.MONGODB_URI, options);
return (this.mongoDbConnection.connection.readyState === 1);
Run Code Online (Sandbox Code Playgroud)

但这会创建与 mongo DB 服务器的新连接。我想要的是检索 NestJS 通过 app.module.ts 中的 MongooseModule.forRoot 建立的现有连接的 readyState。

我不确定如何在健康检查服务代码中检索现有的猫鼬连接对象。任何帮助将非常感激。

kaz*_*vac 13

我建议使用 @nestjs/terminus 模块,请参阅文档和/或存储库以将模块集成到应用程序中。

你的健康控制器看起来像这样

import { Controller, Get } from "@nestjs/common";
import {
  HealthCheck,
  HealthCheckResult,
  HealthCheckService,
  MongooseHealthIndicator,
} from "@nestjs/terminus";

@Controller("health")
export class HealthController {

  constructor(
    private healthCheck: HealthCheckService,
    private mongooseHealth: MongooseHealthIndicator,
  ) {
  }

  @Get()
  @HealthCheck()
  async check(): Promise<HealthCheckResult> {
    return this.healthCheck.check(
      [
        () => this.mongooseHealth.pingCheck("mongoDB"),
      ],
    );
  }

}

Run Code Online (Sandbox Code Playgroud)


Trw*_*wKc 6

尝试删除此行

useUnifiedTopology: true
Run Code Online (Sandbox Code Playgroud)

更新:

我为我的回答道歉。我的项目像这样为 K8s 创建健康检查路线

import { InjectConnection } from '@nestjs/mongoose';
import { Connection } from 'mongoose';

@Controller()
export class HealthzController {
  constructor (@InjectConnection() private readonly connection: Connection) { }

  @Get('/_status/healthz')
  healthCheck (@Res() res: Response) {
    if (this.connection.readyState === 1) {
      res.status(HttpStatus.OK).json({ db: { status: 'up' } });
    } else {
      res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ db: { status: 'down' } });
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

希望能帮到你。