index.ts 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  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. default:
  31. console.log({
  32. ...response,
  33. ...options,
  34. message: `please check api ${url}${options.url}`,
  35. });
  36. reject(response);
  37. }
  38. });
  39. };
  40. class Server {
  41. private static instance: Server;
  42. private BASE_URL: string;
  43. constructor() {
  44. this.BASE_URL = process.env.NEXT_PUBLIC_BASE_URL as string;
  45. }
  46. async request<T, R = unknown>(options: ServerOptions): Promise<Response<T> & R> {
  47. options = requestInterceptor(options);
  48. const { method = "GET", url, headers = {}, data = {}, body, ...other } = options;
  49. const params = JSON.stringify(data);
  50. try {
  51. const response = await fetch(`${this.BASE_URL}${url}`, {
  52. method: method,
  53. headers: {
  54. Token: cookies().get("Token")?.value || "",
  55. "Content-Type": "application/json",
  56. language:
  57. cookies().get("language")?.value || cookies().get("NEXT_LOCALE")?.value,
  58. ...headers,
  59. },
  60. body: params,
  61. ...other,
  62. }).then((res) => res.json());
  63. return responseInterceptor<T, R>(response, options, this.BASE_URL);
  64. } catch (error) {
  65. console.log(`🚀🚀🚀🚀🚀-> in index.ts on 67`, error);
  66. return Promise.reject(error);
  67. }
  68. }
  69. }
  70. export const server = new Server();