userErrors 和顶层 errors 到底先看哪个
现象#
调用 productCreate 返回 200,代码读 data.productCreate.product.id 时抛空指针;换一条查询又只拿到 errors 数组,data 直接是 null。
原因#
- 顶层
errors表示请求本身不合法,例如字段名拼错、成本超限,此时 data 为 null userErrors属于业务校验失败,请求执行了但没落库,HTTP 状态仍是 200- 选择集里某个非空字段报错会让整个 data 变成 null,其他字段的结果一起被掩盖
- SDK 把 errors 抛异常、把 userErrors 当普通数据返回,业务层容易只处理其中一种
处理步骤#
- 统一封装:先判
errors非空则按请求错误抛出,附带extensions.code - 再判
payload.userErrors非空,逐条记录field与message - 两者都为空才认为写入成功,并回读
id确认对象真实存在 - 对
MAX_COST_EXCEEDED与 THROTTLED 单独走退避重试,不要计入业务失败 - 日志同时记
X-Request-Id,方便与 Shopify 侧记录对齐
验收标准#
构造缺必填字段的请求,日志出现 userErrors 的 field 与 message;构造错字段名的请求,出现顶层 errors 与 code,两条路径互不吞没。
本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。