哎,老革命遇到新问题,创业+远程工作之后,想拉几个人跟我一起排查 bug 也找不到,只好公开求助+悬赏。
首先请大家看下面这段视频:
简单来说,我们做了一个网站:Dailylift.io。在这个网站上,你能描述自己今天的状态,然后得到一些心灵慰藉:你信仰的目标会给你写一封信。
这个功能并不复杂,我选择用 Nuxt3 + Supabase 作为技术栈。我的理由是:
- 因为我们需要 SEO,我希望利用 Nuxt3 SSR 功能提升 SEO 效果。
- Supabase 提供包括开箱即用的用户系统在内的一系列 Serverless 功能,可以帮助我们的开发提速。
- Supabase 提供 Nuxt3 SDK,比 Auth0 更方便。
- Supabase 提供 VectorPG,方便我们使用 Embedding
但是实际运行起来之后,却发现一些我未曾预料到的问题,主要跟用户登录状态有关。具体复现步骤为:
- 用户未登录时,先填写感受和目标,然后点“收信”,我们会要求他登录
- 用户登录后,我们需要先检查他的收信记录,确保每天只有收一封信
- 接下来,如果他今天还没有收信,我们就继续之前的过程,给他写信
- 但是偶尔,前面都正常,登录之后就卡住了,无法进入发信流程
我尝试了很多方案,想解决这个问题,每次我都觉得自己搞定了,我甚至还写了一篇博客作为分享:使用 Vercel、Supabase、Stripe 打造 OpenAI 计费系统:2. 处理用户注册/登录。但是之后老板就会再次遇到这个问题,然后把我一通数落。我怎么也找不到稳定重现的方式,只能反复查验代码,希望找到其中的漏洞。
我有几个怀疑:
- Nuxt + Supabase,理论上存在两个环境有用户态:SSR与浏览器。我不确定这里会不会有问题。比如,为了防止 refresh token 的时候触发
onAuthStateChange
,我用useSupabaseUser
获取初始用户状态。会不会是它导致后面判断出错了(很小概率)? - 我需要先检查用户的邮件历史,再决定是否请求信件。这里可能也会有问题,比如两次请求之间的先后顺序。
- Supabase SSO 只支持 redirect,必须跳走再回来,所以浏览器里的状态无法保存。从第三方回来,处理
access_token
期间,可能因为网络状态、本地内存状态等,进入到某个我没处理的分支,导致失败。 - 登录之后,
onAuthStateChange
到用户登录彻底完成之前,中间其实有一小段时间,会不会是网络问题导致它被卡住了?
总之吧,我现在一个人开发,面对这些问题有些焦头烂额,所以希望所有看到这篇博客的同学,能帮我测试一下网站:Dailylift.io,帮我想想其中可能存在的坑,如果您有处理类似问题的经验,也请多分享一些。无论您:
- 帮我找到稳定重现的方式
- 帮我固定住 bug 出现的现场
- 帮我找到代码中潜藏的问题
- 引导我找到正确的方向
- 分享有价值的经验
我一定大红包伺候!感谢大家,期待帮忙。
更新:
2023-08-31
今天我早上测试的时候,遇到一个很诡异的问题:我通过 Google 登录后,遇到一个加载信件列表 400 错误,导致获取新信件失败。
看路径和参数,这个请求应该是正常的。最诡异的是,我在 Devtools 里看不到这个错误,只能看到两个 GET /letters
的请求,都是正常 200。
我现在怀疑这个问题是不是这样的:
- SSR 阶段它也会发起一个请求
- 这个请求在某个情况下会失败
- 这个失败会导致渲染出的页面携带着失败的状态,继而无法继续。
另外,因为我们使用 TiDB Serverless,会不会是冷启动时会产生长延迟,导致 Vercel Serverless 失败?不过我看了数据库,也有很多是几个小时后成功的,也不太像。
欢迎吐槽,共同进步