index.ts 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. import { redirect } from "@/i18n/routing";
  2. import { Response } from "@/types";
  3. import { cookies } from "next/headers";
  4. import { ServerOptions } from "./type";
  5. const requestInterceptor = (options: ServerOptions) => {
  6. // 判断token
  7. if (options.checkToken) {
  8. const token = cookies().has("Token");
  9. if (!token) {
  10. redirect({ href: "/login", locale: "en" });
  11. }
  12. }
  13. return options;
  14. };
  15. const responseInterceptor = <T = any, R = unknown>(
  16. response: Response<T> & R,
  17. options: ServerOptions,
  18. url: string
  19. ): Promise<Response<T> & R> => {
  20. return new Promise((resolve, reject) => {
  21. const { code, msg } = response;
  22. switch (code) {
  23. case 200:
  24. resolve(response);
  25. break;
  26. case 401:
  27. console.log(`🚀🚀🚀🚀🚀->server-code: 401`, options.url);
  28. redirect({ href: "/login", locale: "en" });
  29. break;
  30. case 500:
  31. reject(response);
  32. break;
  33. default:
  34. console.log({
  35. ...response,
  36. ...options,
  37. message: `please check api ${url}${options.url}`,
  38. });
  39. resolve(response);
  40. }
  41. });
  42. };
  43. class Server {
  44. private static instance: Server;
  45. private BASE_URL: string;
  46. constructor() {
  47. this.BASE_URL = process.env.NEXT_PUBLIC_BASE_URL as string;
  48. }
  49. async request<T, R = unknown>(options: ServerOptions): Promise<Response<T> & R> {
  50. options = requestInterceptor(options);
  51. const { method = "GET", url, headers = {}, data = {}, body, ...other } = options;
  52. const params = JSON.stringify(data);
  53. try {
  54. const response = await fetch(`${this.BASE_URL}${url}`, {
  55. method: method,
  56. headers: {
  57. Token: cookies().get("Token")?.value || "",
  58. "Content-Type": "application/json",
  59. language:
  60. cookies().get("language")?.value || cookies().get("NEXT_LOCALE")?.value,
  61. ...headers,
  62. },
  63. body: params,
  64. ...other,
  65. })
  66. .then((res) => res.json())
  67. .catch((error) => {
  68. console.log(`🚀🚀🚀🚀🚀-> in index.ts on 68`, error);
  69. return {};
  70. });
  71. return responseInterceptor<T, R>(response, options, this.BASE_URL);
  72. } catch (error) {
  73. console.log(
  74. `🚀🚀🚀🚀🚀-> in index.ts on 67`,
  75. error,
  76. `${this.BASE_URL}${options.url}`,
  77. JSON.stringify(options)
  78. );
  79. return Promise.reject(error);
  80. }
  81. }
  82. }
  83. export const server = new Server();