EventStore appendToStream报Could not recognize BadRequest问题排查
EventStoreDB 写入报
Could not recognize BadRequest问题排查 错误表现
调用appendToStream写入事件时抛出未知错误,堆栈信息:
game process tick failed UnknownError: Could not recognize BadRequest at unpackToCommandError (\node_modules\@eventstore\db-client\dist\streams\appendToStream\unpackError.js:53:12) at ClientDuplexStreamImpl.<anonymous> (\node_modules\@eventstore\db-client\dist\streams\appendToStream\batchAppend.js:38:66)
对应写入逻辑代码:
async function gameProcessPush(channel,event) { console.log("pushing:",event); try { console.log("trying to append..:",event); await client.appendToStream("factory",[event]); console.log("appending to stream"); } catch(e) { console.log("game process tick failed",e); throw {live: false, code: 26, event: event} } console.log("game processing..."); }
调试时捕获的自定义错误输出:
processing factory failed { live: false, code: 26, event: { type: 'factory-creation', sub: 'sub-factory', userid: 1 } } result in : undefined
问题原因
- 事件格式不符合规范:代码头部已经导入了官方提供的
jsonEvent事件构造方法,但完全没有使用。自定义CreateEvent返回的对象缺少EventStoreDB要求的必填字段:每个事件必须有全局唯一的UUID格式id,业务载荷必须放在data字段下。当前构造的事件直接把sub/userid这类业务字段平铺在事件根层级,服务端收到非法格式请求直接返回400 Bad Request,使用的客户端版本没有对这类400错误做明确映射,才抛出了识别不了BadRequest的模糊报错。 - 业务字段漏传:
Factory.create方法接收的creation参数包含location/name等业务字段,但调用CreateEvent时只传了userid和sub,后续持久化的事件会丢失这部分数据。
修复方法
- 改写事件构造逻辑,使用官方
jsonEvent生成符合规范的事件,先安装uuid依赖用于生成事件唯一ID:
修正后的npm install uuidCreateEvent函数:const { v4: uuidv4 } = require('uuid'); function CreateEvent(type,data) { return jsonEvent({ id: uuidv4(), type: type, data: data }) } - 修正
Factory.create中的事件构造传参,把完整业务数据传入事件:public async create(creation : creationFactory) { console.log("creating new factory.....",creation); // 传入完整的creation对象,不要手动挑字段导致漏数据 const NewFactoryEvent = CreateEvent("factory-creation", creation) try { console.log("creating newfac",NewFactoryEvent); await gameProcessPush("factory",NewFactoryEvent) } catch(error) { console.log("processing factory failed",error); } } - 可选优化:将
@eventstore/db-client升级到最新版本,后续遇到格式错误、权限问题这类请求错误时,会返回明确的错误提示,不会再出现无法识别BadRequest的模糊报错。
内容的提问来源于stack exchange,提问作者maria
相关产品推荐
相关产品推荐

