fogwind 3 dní pred
rodič
commit
c83a0bf416
1 zmenil súbory, kde vykonal 34 pridanie a 5 odobranie
  1. 34 5
      README.md

+ 34 - 5
README.md

@@ -304,7 +304,7 @@ useEffect 只会在客户端执行,具体是在浏览器绘制后执行,服
     ---- rest api 错误处理
     ---- graphql接口返回的错误有的有extensions字段,有的没有 具体可以查看nshop项目packages/Webkul/BagistoApi/src/Exception/下的异常类(一般看是否有getExtensions方法)
     ---------骨架已搭好,待验证是否好用-------------
-    
+
 10. 产品详情页代码优化 --- 已完成
 11. 代码eslint检查修改 -- 已完成
 12. 下单成功后需要重新创建购物车token -- 无需处理
@@ -352,10 +352,39 @@ useEffect 只会在客户端执行,具体是在浏览器绘制后执行,服
 
 > 39,40 参考 https://chatgpt.com/share/6a4f0637-ad28-83ea-ad44-423740795054
 
-## 接入klarna
-1. 从服务端获取client_token
-2. 需要加载js sdk
-3. 获取authorization_token
+## 关于请求接口和错误处理
+接口请求有四种情况:服务端组件里的graphql请求和restful请求;客户端组件里的graphql请求和restful请求。
+### 服务端组件里的graphql请求
+服务端组件里的graphql请求统一使用serverGraphqlFetch方法。
+
+对于php接口返回的错误可以通过serverGraphqlFetch方法返回的error字段解析,根据情况在页面上提示用户;
+
+对于不是php接口引起的错误,也可以说是serverGraphqlFetch方法本身引起的错误,会被抛出,然后被error.tsx或global-error.tsx捕获处理。
+### 服务端组件里的restful请求。
+服务端组件里的restful请求使用restApiFetch方法直接请求php后端接口,根据body字段的结构解析php接口返回的错误;
+
+对于不是php接口引起的错误,也可以说是restApiFetch方法本身引起的错误,会被抛出,然后被error.tsx或global-error.tsx捕获处理。
+### 客户端组件中的graphql请求。
+客户端组件中的graphql请求使用的是apollo client。
+
+apollo client的错误处理([文档](https://www.apollographql.com/docs/react/data/error-handling)):
+- try...catch 捕获;
+- 如果是像useQuery这种返回结果中有error字段的,中通过error属性处理;
+- 通过hook的onError回调处理;
+
+不管哪种方式都可以使用`src\lib\ApolloErrorHandler.ts`里的handleApolloBusinessError方法处理业务错误;handleErrorForErrorLink处理其他错误。
+
+### 客户端组件里的restful请求
+客户端组件里的restful请求使用`src\lib\restApiClient.ts`里的clientFetch方法发起。
+
+客户端发起的restful请求都是请求的next.js的route handler。
+在route handler里请求php的接口。
+
+clientFetch方法没有使用try...catch,不主动抛出异常。在实际调用clientFetch的地方使用try...catch捕获代码错误。在clientFetch的返回结果中解析接口返回的错误。
+
+> fetch方法不会抛出异常。接口的状态码即使是500,也不会抛出异常,也是resolve。所以try...catch包裹fetch不会捕获到状态码非2xx的错误(除非你手动抛出异常,具体可以看MDN文档)。
+
+> graphql请求的状态码只有200。所以即使php接口报错,状态码也是200。
 
 
 ## 关于购物车数据管理方案