一个端点收多个 topic,路由错乱怎么排查
现象#
同一个 /webhooks 地址订了 orders/create 与 products/update,结果商品事件被写进订单表,落库字段大面积为 null。
原因#
- 路由按 body 里的 id 猜类型,两种资源的 id 都是数字,猜不出真实来源
- 代码读 req.body.topic,而该字段只在 X-Shopify-Topic header 里,body 中没有
- 中间件把多个订阅的 body 合并处理,后到的商品事件覆盖了先到的订单事件
- 用 GraphQL 枚举名 PRODUCTS_UPDATE 匹配,header 是 products/update,永不命中
处理步骤#
- 入口第一行读
req.headers['x-shopify-topic'],按它的字符串值分发 - 为每个 topic 拆独立路径,例如
/webhooks/orders,减少分支判断 - 同时断言
X-Shopify-Shop-Domain与X-Shopify-API-Version - 把 topic 与 body 主键写进同一条结构化日志,便于回溯错投
- 用
--topic=products/update触发一次,确认只走商品分支
验收标准#
商品事件只进商品表、订单事件只进订单表,日志里 topic 与目标表名一一对应。
本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。