如何使用 @nestjs/terminus 为 Prisma 创建自定义健康检查?
How to create a custom health check for Prisma with @nestjs/terminus?
因为 @nestjs/terminus doesn't provide a health check for Prisma, I'm trying to create it based on their Mongoose health check.
当我尝试时:
import * as Prisma from 'prisma';
...
...
private getContextConnection(): any | null {
const {
getConnectionToken,
// eslint-disable-next-line @typescript-eslint/no-var-requires
} = require('prisma') as typeof Prisma;
try {
return this.moduleRef.get(getConnectionToken('DatabaseConnection') as string, {
strict: false,
});
} catch (err) {
return null;
}
}
...
...
const connection = options.connection || this.getContextConnection();
if (!connection) {
throw new ConnectionNotFoundError(
this.getStatus(key, isHealthy, {
message: 'Connection provider not found in application context',
}),
);
}
我似乎总是收到:“消息”:“在应用程序上下文中找不到连接提供程序”。
连接有问题,或者我不太了解健康检查的实际工作原理
猫鼬实现的原始副本不会起作用,因为 NestJSMongoose
type/module 和 Prisma
之间存在差异。特别是 getConnectionToken
不存在于 Prisma
包中。
我无法评论扩展 terminus 以支持 prisma 的最佳方式。为此,您可能需要深入研究 terminus
界面。但是,在 Prisma 中获取健康值 check/ping 的一种简单方法是使用以下查询:
prisma.$queryRaw`SELECT 1`
这个问题帮助我为 NestJS 构建了 Prisma 健康检查。
这是我做的:
import { Injectable } from "@nestjs/common";
import { HealthCheckError, HealthIndicator, HealthIndicatorResult } from "@nestjs/terminus";
import { PrismaService } from "./prisma.service";
@Injectable()
export class PrismaHealthIndicator extends HealthIndicator {
constructor(private readonly prismaService: PrismaService) {
super();
}
async isHealthy(key: string): Promise<HealthIndicatorResult> {
try {
await this.prismaService.$queryRaw`SELECT 1`;
return this.getStatus(key, true);
} catch (e) {
throw new HealthCheckError("Prisma check failed", e);
}
}
}
这会注入一个 PrismaService
,与 NestJS 文档中显示的完全一样。 https://docs.nestjs.com/recipes/prisma#use-prisma-client-in-your-nestjs-services
您也可以将 prismaService
替换为 new PrismaClient()
。
因为 @nestjs/terminus doesn't provide a health check for Prisma, I'm trying to create it based on their Mongoose health check.
当我尝试时:
import * as Prisma from 'prisma';
...
...
private getContextConnection(): any | null {
const {
getConnectionToken,
// eslint-disable-next-line @typescript-eslint/no-var-requires
} = require('prisma') as typeof Prisma;
try {
return this.moduleRef.get(getConnectionToken('DatabaseConnection') as string, {
strict: false,
});
} catch (err) {
return null;
}
}
...
...
const connection = options.connection || this.getContextConnection();
if (!connection) {
throw new ConnectionNotFoundError(
this.getStatus(key, isHealthy, {
message: 'Connection provider not found in application context',
}),
);
}
我似乎总是收到:“消息”:“在应用程序上下文中找不到连接提供程序”。 连接有问题,或者我不太了解健康检查的实际工作原理
猫鼬实现的原始副本不会起作用,因为 NestJSMongoose
type/module 和 Prisma
之间存在差异。特别是 getConnectionToken
不存在于 Prisma
包中。
我无法评论扩展 terminus 以支持 prisma 的最佳方式。为此,您可能需要深入研究 terminus
界面。但是,在 Prisma 中获取健康值 check/ping 的一种简单方法是使用以下查询:
prisma.$queryRaw`SELECT 1`
这个问题帮助我为 NestJS 构建了 Prisma 健康检查。
这是我做的:
import { Injectable } from "@nestjs/common";
import { HealthCheckError, HealthIndicator, HealthIndicatorResult } from "@nestjs/terminus";
import { PrismaService } from "./prisma.service";
@Injectable()
export class PrismaHealthIndicator extends HealthIndicator {
constructor(private readonly prismaService: PrismaService) {
super();
}
async isHealthy(key: string): Promise<HealthIndicatorResult> {
try {
await this.prismaService.$queryRaw`SELECT 1`;
return this.getStatus(key, true);
} catch (e) {
throw new HealthCheckError("Prisma check failed", e);
}
}
}
这会注入一个 PrismaService
,与 NestJS 文档中显示的完全一样。 https://docs.nestjs.com/recipes/prisma#use-prisma-client-in-your-nestjs-services
您也可以将 prismaService
替换为 new PrismaClient()
。