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

时间:2019-10-22 15:16:28

标签: node.js mongodb mongoose 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
})]

现在,NestJS服务正在Kubernetes集群中运行,并且具有适当的运行状况,活动性和准备情况检查。每当在服务上调用准备就绪或运​​行状况端点时,我都需要检查托管的Atlas Mongo数据库连接是否可用或是否存在中断。到目前为止,已针对就绪和健康端点执行以下代码:

this.mongoDbConnection = await mongoose.connect(process.env.MONGODB_URI, options);
return (this.mongoDbConnection.connection.readyState === 1);

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

我不确定如何在运行状况检查服务代码中检索现有的猫鼬连接对象。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:2)

我建议使用@ nestjs / terminus模块,请参阅documentation和/或repository将模块集成到应用程序中。

您的健康控制者可能看起来像这样

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"),
      ],
    );
  }

}

答案 1 :(得分:1)

猫鼬将在全球范围内提供,它将为您处理(默认情况下池数):

在节点线程上的任何文件上,您都可以导入猫鼬并读取状态

import mongoose from 'mongoose';

console.log(mongoose.connection.readyState);
  

注意:   如果您直接调用它而没有任何异步函数,则将其包装为其他函数状态时将返回0状态

答案 2 :(得分:0)

尝试删除此行

useUnifiedTopology: true

更新:

我很抱歉。我的项目为这样的K8创建健康检查路线

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

希望对您有帮助。