- 添加项目基础结构,包括 .gitignore、package.json、Docker 配置和环境变量示例 - 实现核心模块:Kafka 消费者、PostgreSQL 数据库管理器、Redis 客户端与错误队列 - 添加工具类:日志记录器、指标收集器、UUID 生成器 - 实现数据处理器,支持 0x36 上报和 0x0F 命令的解析与存储 - 添加数据库初始化脚本和分区管理,支持按时间范围分区 - 引入 Zod 数据验证和 Vitest 单元测试框架 - 提供完整的项目文档,包括数据库设计、Kafka 格式规范和 Redis 集成协议
2.9 KiB
2.9 KiB
测试报告
基本信息
- 运行时间: 2026-01-29
- 运行方式: 控制台启动
npm run dev,运行约 60 秒后 Ctrl + C 终止 - 测试目标: 验证 Kafka 消费与入库链路,定位无入库原因
控制台关键日志
{"level":"error","message":"Message processing failed","timestamp":1769734880590,"context":{"error":"[\n {\n \"expected\": \"number\",\n \"code\": \"invalid_type\",\n \"path\": [\n \"hotel_id\"\n ],\n \"message\": \"Invalid input: expected number, received string\"\n }\n]","type":"PARSE_ERROR","stack":"ZodError: ...","rawPayload":"{\"ts_ms\":1769692878011,\"hotel_id\":\"2147\",\"room_id\":\"8209\",\"device_id\":\"099008129081\",\"direction\":\"上报\",\"cmd_word\":\"36\",\"frame_id\":52496,...}","validationIssues":[{"expected":"number","code":"invalid_type","path":["hotel_id"],"message":"Invalid input: expected number, received string"}]}}
结论
- 数据未入库的直接原因: Kafka 消息在解析阶段触发 Zod 校验失败,
hotel_id为字符串类型而非文档要求的 Number,导致PARSE_ERROR,数据库插入流程未执行。
与文档格式的一致性检查
对照 kafka_format.md:
hotel_id: 文档要求 Number,但实测为字符串 (示例:"2147"),不一致。cmd_word: 文档要求"0x36"/"0x0F",实测为"36",不一致。control_list: 文档要求 Array/可选,但实测为null,不一致。- 其余关键字段如
ts_ms,room_id,device_id,direction,udp_raw均存在。
已增强的控制台错误输出
为了便于定位异常,以下模块已经增加详细错误输出到 PowerShell 控制台:
- Kafka 处理异常: 输出
type,stack,rawPayload,validationIssues,dbContext - 数据库插入异常: 输出
schema,table,rowsLength - Redis 入队与重试异常: 输出详细错误信息
相关改动文件:
建议修改方向
以下为解决无入库问题的可选方案,由你决定是否执行:
- 上游严格按文档输出:
hotel_id改为 Numbercmd_word改为"0x36"/"0x0F"control_list用[]或省略字段,避免null
- 下游放宽校验并做类型转换:
- 将
hotel_id支持字符串并转换为 Number - 继续兼容
cmd_word = "36"的写法 control_list/device_list/fault_list接受null并转为空数组
- 将
当前代码已兼容 cmd_word="36" 和 control_list=null,但 hotel_id 仍按文档严格要求 Number。