Shopify 报错排障

应用报 undefined method for nil 怎么查

现象#

自建应用在 OAuth 回调里抛 NoMethodError: undefined method 'shop' for nil:NilClass,浏览器停在 500 页,堆栈指向读取 session 的那一行。

原因#

  • 回调请求没带上有效 session,session 对象为 nil,后续取字段自然炸掉
  • 应用起了多实例却没共享 session 存储,授权请求与回调落到不同实例
  • cookie 的 SameSite 设为 Lax 或 Strict,嵌入式 iframe 的跨站回调不带 cookie
  • 中间件顺序错了,鉴权逻辑排在 session 初始化之前执行

处理步骤#

  1. 在回调入口打印 params[:shop] 与 session[:shopify],看哪个为空
  2. 把 session 落到 Redis 等外部存储,并在 shopify_app.rb 里指向同一实例
  3. 嵌入式场景把 cookie 改成 SameSite=None; Secure,同时保留 state 校验
  4. 确认 EnsureInstalled 一类中间件排在 session 初始化之后
  5. 对 nil 分支显式处理:回跳 /auth?shop=... 重新授权,别继续往下跑

验收标准#

从店铺后台点开应用能走完授权并落到首页,日志里不再出现 NoMethodError,每个请求的 session[:shopify] 都有值。

本文由 风格技术 技术团队整理,适用于 Shopify 标准版与 Plus 店铺。Shopify 平台能力迭代较快,具体操作路径与字段以官方文档和店铺后台实际版本为准。