Files
Web_BLS_RCUAction_Server/docs/测试报告.md
XuJiacheng 86a1e79153 feat: 初始化后端服务基础架构与核心组件
- 添加项目基础结构,包括 .gitignore、package.json、Docker 配置和环境变量示例
- 实现核心模块:Kafka 消费者、PostgreSQL 数据库管理器、Redis 客户端与错误队列
- 添加工具类:日志记录器、指标收集器、UUID 生成器
- 实现数据处理器,支持 0x36 上报和 0x0F 命令的解析与存储
- 添加数据库初始化脚本和分区管理,支持按时间范围分区
- 引入 Zod 数据验证和 Vitest 单元测试框架
- 提供完整的项目文档,包括数据库设计、Kafka 格式规范和 Redis 集成协议
2026-01-30 11:05:00 +08:00

2.9 KiB
Raw Blame History

测试报告

基本信息

  • 运行时间: 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 入队与重试异常: 输出详细错误信息

相关改动文件:

建议修改方向

以下为解决无入库问题的可选方案,由你决定是否执行:

  1. 上游严格按文档输出:
    • hotel_id 改为 Number
    • cmd_word 改为 "0x36" / "0x0F"
    • control_list[] 或省略字段,避免 null
  2. 下游放宽校验并做类型转换:
    • hotel_id 支持字符串并转换为 Number
    • 继续兼容 cmd_word = "36" 的写法
    • control_list/device_list/fault_list 接受 null 并转为空数组

当前代码已兼容 cmd_word="36"control_list=null,但 hotel_id 仍按文档严格要求 Number。