我正在使用@ 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。
我不确定如何在运行状况检查服务代码中检索现有的猫鼬连接对象。任何帮助将不胜感激。
答案 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' } });
}
}
}
希望对您有帮助。