Browse Source

添加前端登录状态下,加购接口返回游客token时的处理逻辑

fogwind 1 day ago
parent
commit
4b3df31470
3 changed files with 32 additions and 7 deletions
  1. 23 6
      src/actions/addProductToCartAction.ts
  2. 3 0
      src/utils/auth.ts
  3. 6 1
      src/utils/hooks/useAddToCart.ts

+ 23 - 6
src/actions/addProductToCartAction.ts

@@ -17,14 +17,15 @@ export async function addProductToCartAction(param:AddToCartVariables) {
     const cookieStore = await cookies();
     const guestCartToken = cookieStore.get(GUEST_CART_TOKEN)?.value;
 
-
+    // 针对游客
     if(!accessToken && !guestCartToken) {
         const createRes = await createGuestCartToken();
         if(!createRes.success) {
             return {
                 success: false,
                 msg: createRes.msg,
-                cartData: null
+                cartData: null,
+                error: new Error(createRes.msg)
             }
         }
     }
@@ -42,6 +43,7 @@ export async function addProductToCartAction(param:AddToCartVariables) {
             if(responseData) {
                 const responseCartId = responseData.id;
                 const responseCartToken = responseData.cartToken;
+                // 游客状态下
                 if(!accessToken && responseCartId !== responseCartToken) {
                     await setGuestCookie({
                         guestCartId: responseCartId,
@@ -49,27 +51,42 @@ export async function addProductToCartAction(param:AddToCartVariables) {
                         isGuest: true
                     });
                 }
+                // 登录状态,但是后端发现用户的accessToken不可用返回一个游客token时,需要走退出登录流程,提示用户过期了需要重新登录
+                if(accessToken && responseCartId !== responseCartToken) {
+                    const e = new Error("Authorization Bearer token has expired!");
+                    e.name = "UnauthorizedError";
+                    return {
+                        success: false,
+                        msg: e.message,
+                        cartData: response.data,
+                        error: e
+                    }
+                }
             }
             /** 兜底代码 end*/
 
             return {
                 success: true,
                 msg: '',
-                cartData: response.data
+                cartData: response.data,
+                error: null
             }
 
         } else {
             return {
                 success: false,
                 msg: response.error.message,
-                cartData: null
+                cartData: null,
+                error: new Error(response.error.message)
             }
         }
     } catch(error) {
+        const msg = error instanceof Error ? error.message : 'Add product to cart failed!';
         return {
             success: false,
-            msg: error instanceof Error ? error.message : 'Add product to cart failed!',
-            cartData: null
+            msg: msg,
+            cartData: null,
+            error: new Error(msg)
         }
     }
 };

+ 3 - 0
src/utils/auth.ts

@@ -69,8 +69,11 @@ export const authOptions: NextAuthOptions = {
   ],
 
   //https://next-auth.js.org/configuration/callbacks
+  // nextAuth.js 的jwt token 和session 存在自动续签问题
+  // 但是accessToken没有刷新机制
   callbacks: {
     async jwt({ token, user }) {
+      // 登录时 user是有值的,登录过后,获取用户信息user是null
       if (user) {
         token.id = user.id;
         token.apiToken = user.apiToken;

+ 6 - 1
src/utils/hooks/useAddToCart.ts

@@ -9,6 +9,7 @@ import { useMutation, useApolloClient } from "@apollo/client/react";
 import {
   UPDATE_CART_ITEM,
 } from "@/graphql";
+import { emitAuthExpired } from "@/utils/auth/auth-events";
 import { formatCartDetail } from "@/utils/cartDetailTools";
 import {handleApolloBusinessError} from "@/lib/ApolloErrorHandler";
 import {addProductToCartAction, deleteCartProductAction} from '@/actions';
@@ -43,7 +44,11 @@ export const useAddProduct = () => {
           
 
       } else {
-          showToast(res.msg, "danger");
+          if(res.error && res.error.name === 'UnauthorizedError') {
+            emitAuthExpired();
+          } else {
+            showToast(res.msg, "danger");
+          }
       }
       return result;
   };