Shopify应用卸载后重装遇404错误及P2002约束问题求助
Shopify Remix应用重装404与Prisma冲突问题排查
1. Prisma P2002主键冲突根源
- 店铺侧重装时,Shopify可能复用旧授权参数或Session ID,而你的应用卸载逻辑可能未彻底清理Session关联数据(含缓存),导致创建新Session时触发唯一约束。即便数据库表无记录,缓存中的残留Session也会引发冲突。
- 排查动作:
- 验证
APP_UNINSTALLEDwebhook:确认事件触发时,执行了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
相关产品推荐
相关产品推荐

