P1 端到端验证中发现 IAM 服务存在 14 个 TS 编译错误与运行时 DI 失败: - 移除 typeorm/ioredis/kafkajs 依赖(IAM 用 Drizzle) - health.controller.ts 改用 db.execute(sql SELECT 1) 校验连接 - lifecycle.service.ts 简化为只关闭 Drizzle 连接池 - Drizzle API 修正:r.roles -> r.iam_roles,.in() -> inArray() - ESM 模式下 DI 必须显式 @Inject(IamRepository)(参考 classes 黄金模板) - iam.controller.ts 直接读 req.headers[x-user-id],不依赖未注册的 AuthMiddleware - health.module.ts 补 .js 后缀 - package.json 补 @types/express 验证:register -> JWT -> Gateway /iam/me 200 -> /classes CRUD 200
55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
import { Controller, Get, HttpException, HttpStatus } from "@nestjs/common";
|
||
import { sql } from "drizzle-orm";
|
||
import { getDb } from "../../config/database.js";
|
||
|
||
const SERVICE_NAME = "iam";
|
||
|
||
/**
|
||
* 健康检查端点。
|
||
*
|
||
* - GET /healthz:liveness,仅返回进程存活,不检查依赖。
|
||
* - GET /readyz:readiness,检查 DB 连接,失败返回 503。
|
||
*
|
||
* 不需要鉴权,必须在路由白名单中放行。本控制器内容在 iam / core-edu /
|
||
* content / msg / classes 五个 NestJS 服务中一致,仅 SERVICE_NAME 不同。
|
||
*/
|
||
@Controller()
|
||
export class HealthController {
|
||
@Get("healthz")
|
||
liveness(): { status: string; service: string; timestamp: string } {
|
||
return {
|
||
status: "ok",
|
||
service: SERVICE_NAME,
|
||
timestamp: new Date().toISOString(),
|
||
};
|
||
}
|
||
|
||
@Get("readyz")
|
||
async readiness(): Promise<{
|
||
status: string;
|
||
service: string;
|
||
timestamp: string;
|
||
}> {
|
||
try {
|
||
const db = getDb();
|
||
await db.execute(sql`SELECT 1`);
|
||
return {
|
||
status: "ok",
|
||
service: SERVICE_NAME,
|
||
timestamp: new Date().toISOString(),
|
||
};
|
||
} catch (error) {
|
||
throw new HttpException(
|
||
{
|
||
status: "error",
|
||
service: SERVICE_NAME,
|
||
timestamp: new Date().toISOString(),
|
||
error:
|
||
error instanceof Error ? error.message : "database unreachable",
|
||
},
|
||
HttpStatus.SERVICE_UNAVAILABLE,
|
||
);
|
||
}
|
||
}
|
||
}
|