You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shopify应用卸载后重装遇404错误及P2002约束问题求助

Shopify Remix应用重装404与Prisma冲突问题排查

1. Prisma P2002主键冲突根源

  • 店铺侧重装时,Shopify可能复用旧授权参数或Session ID,而你的应用卸载逻辑可能未彻底清理Session关联数据(含缓存),导致创建新Session时触发唯一约束。即便数据库表无记录,缓存中的残留Session也会引发冲突。
  • 排查动作:
    • 验证APP_UNINSTALLED webhook:确认事件触发时,执行了prisma.session.deleteMany({ where: { shop: shopDomain } }),同时清理Redis/内存等缓存中的对应店铺Session。
    • 调整Prisma Schema:若Session表主键为复合键(如shop+id),改为自增ID+shop字段唯一约束,避免旧ID复用冲突。
    • 临时测试:重装前手动清空Session表,若安装正常,说明是残留数据导致的冲突。

2. 店铺侧重装404的关联原因

P2002错误会中断授权流程,Remix授权路由无法生成有效回调响应,最终返回404。而合作伙伴后台安装会生成全新授权参数,不会触发旧Session冲突,因此能成功。

3. WebSocket连接失败的关联影响

WebSocket依赖有效Session Token进行身份验证,Session冲突导致授权失败、Token缺失,进而引发WebSocket握手失败。修复Session问题后,该异常通常会自动消失。

快速修复方案

  • 强化卸载清理:在APP_UNINSTALLED处理函数中,强制删除目标店铺的所有Session及对应缓存数据。
  • 增加冲突捕获处理:在Session创建逻辑中添加异常捕获,遇到P2002时先清理旧Session再重试:
try {
  await prisma.session.create({ data: sessionData });
} catch (error) {
  if (error.code === 'P2002') {
    await prisma.session.deleteMany({ where: { shop: sessionData.shop } });
    await prisma.session.create({ data: sessionData });
  } else {
    throw error;
  }
}
  • 检查Session存储配置:若使用Remix的sessionStorage,确保其与数据库同步清理,避免缓存残留。

内容的提问来源于stack exchange,提问作者user23454134

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 13:05:04