فهرست منبع

加购接口关于token的判断问题修改

fogwind 1 روز پیش
والد
کامیت
847ee33146
2فایلهای تغییر یافته به همراه16 افزوده شده و 6 حذف شده
  1. 10 3
      README.md
  2. 6 3
      src/actions/addProductToCartAction.ts

+ 10 - 3
README.md

@@ -339,7 +339,7 @@ useEffect 只会在客户端执行,具体是在浏览器绘制后执行,服
 35. 结账页默认设置运输方式问题(导致结算联动风暴)
 36. 学习set-state-in-effect,然后检查代码,看是否可以优化(特别是CommonModal组件,看能不能不使用useEffect实现)
 37. paypal provider 支付参数根据环境变量配置 --- 已完成
-38. CartAndUserActions 组件在支付结果页多次挂载问题
+38. CartAndUserActions 组件在支付结果页多次挂载问题 -- 组件已删除
 39. 服务端去掉apollo client。apollo client 只在客户端使用; apollo 错误处理(第9条);
 40. Authorization 写入header优化;-- 已完成
     ---- https://chatgpt.com/share/6a6acb5d-e184-83ea-acfc-839fe0d34caf
@@ -358,8 +358,15 @@ useEffect 只会在客户端执行,具体是在浏览器绘制后执行,服
 48. 游客token的创建优化(想在服务端创建写入token)--- 已完成
 49. 结账页地址模块未登录用户输入邮箱后判断是否注册过,如果注册过让用户登录;--- 已完成
 50. 注册接口,提交的phone是 +1 345345345 格式,但是保存到数据库后成了+1345345345  -- 后端已处理
-51. serverGraphqlFetch 方法中关于token和x-currency, x-channel, x-local 是从cookie中获取的,但是next.js build时检测到调用cookie,会将页面强制转换成动态渲染。
-    也就是说没有缓存了。这个问题需要验证和研究,暂时先不管。
+51. 关于分享组件:https://chatgpt.com/share/6aa351f3-5ed0-83ea-8320-43d34d66f10a
+    -- 可以参考https://github.com/nygardk/react-share
+    -- 接着SocialShare写
+    -- https://developer.mozilla.org/zh-CN/docs/Web/API/Clipboard/writeText
+52. serverGraphqlFetch 方法中关于token和x-currency, x-channel, x-local 是从cookie中获取的,但是next.js build时检测到调用cookie,会将页面强制转换成动态渲染。也就是说没有缓存了。这个问题需要验证和研究,暂时先不管。
+53. 加购之后直接跳转结账页没有触发 结账页loading.tsx;在购物车页跳转其他页面很慢,不能立即触发目标页的loading.tsx;
+54. 如果要启用缓存,要区分渠道,货币,语言;
+55. next-auth 中设置的cookie过期时间存在漂移问题:比如8月1号用户登录,设置的30天过期(8月31号过期)。
+    但是如果用户8月3号又访问网站,那么过期时间会以8月3号往后延30天。不知道为什么会是这种机制。
 
 
 > 39,40 参考 https://chatgpt.com/share/6a4f0637-ad28-83ea-ad44-423740795054

+ 6 - 3
src/actions/addProductToCartAction.ts

@@ -39,12 +39,14 @@ export async function addProductToCartAction(param:AddToCartVariables) {
             const responseData = response.data?.createAddProductInCart?.addProductInCart;
             /** 兜底代码 start*/
             // 游客加购,然后清空购物车,然后刷新页面,然后再加购,然后再刷新页面,购物车会失效,所以添加兜底代码
-            // 如果之前的cartToken有效,responseCartId和responseCartToken的值是一样的都是cart id; 否则两者不相等
+            // 如果之前的cartToken有效,responseCartId和responseCartToken的值是一样的都是cart id; 否则两者不相等(最开始是这样,现在不是了,详情见下面注释)
             if(responseData) {
+                // 登录状态正常情况下: responseData.id 是字符串(比如:"123"),responseData.cartToken 是null
+                // 游客状态正常情况下:responseData.id 是字符串(比如:"123"),responseData.cartToken 是游客token字符串(比如:203b97c9-3417-476a-95df-293b1478131c)
                 const responseCartId = responseData.id;
                 const responseCartToken = responseData.cartToken;
                 // 游客状态下
-                if(!accessToken && responseCartId !== responseCartToken) {
+                if(!accessToken && responseCartToken !== null) {
                     await setGuestCookie({
                         guestCartId: responseCartId,
                         guestToken: responseCartToken,
@@ -52,7 +54,8 @@ export async function addProductToCartAction(param:AddToCartVariables) {
                     });
                 }
                 // 登录状态,但是后端发现用户的accessToken不可用返回一个游客token时,需要走退出登录流程,提示用户过期了需要重新登录
-                if(accessToken && responseCartId !== responseCartToken) {
+                // 此时 responseData.id 是字符串(比如:"123"),responseData.cartToken 是游客token字符串(比如:203b97c9-3417-476a-95df-293b1478131c)
+                if(accessToken && responseCartToken !== null) {
                     const e = new Error("Authorization Bearer token has expired!");
                     e.name = "UnauthorizedError";
                     return {