database.ts 导出 db 常量替代 getDb() env.ts JWT_SECRET 改 optional 并新增 DEV_MODE kafka.ts connectKafka 加 try/catch 不阻塞启动 main.ts 去全局前缀 connectKafka 改非阻塞 app.module 移除未用模块加 HealthModule controller 路由去前缀去 UseGuards 从 x-user-id 读身份 service datetime ISO 字符串转 Date 修复 drizzle 错误 修正相对 import 路径 health/lifecycle 改用 Drizzle 原生查询 新增 core-edu-init.sql 初始化 4 张表 端到端验证: exams/homework/grades 全部 201/200 Outbox 事件正确写入 core_edu_outbox 表
33 lines
788 B
TypeScript
33 lines
788 B
TypeScript
import { Kafka } from "kafkajs";
|
|
import { env } from "./env.js";
|
|
|
|
export const kafka = new Kafka({
|
|
brokers: env.KAFKA_BROKERS.split(","),
|
|
clientId: "core-edu-service",
|
|
});
|
|
|
|
export const producer = kafka.producer({
|
|
idempotent: true,
|
|
transactionalId: "core-edu-tx",
|
|
});
|
|
|
|
export const consumer = kafka.consumer({ groupId: "core-edu-group" });
|
|
|
|
export async function connectKafka(): Promise<void> {
|
|
try {
|
|
await producer.connect();
|
|
await consumer.connect();
|
|
console.log("Kafka connected");
|
|
} catch (err) {
|
|
console.warn(
|
|
"Kafka connect failed, running without Kafka:",
|
|
err instanceof Error ? err.message : String(err),
|
|
);
|
|
}
|
|
}
|
|
|
|
export async function disconnectKafka(): Promise<void> {
|
|
await producer.disconnect();
|
|
await consumer.disconnect();
|
|
}
|