1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586 |
- import { redirect } from "@/i18n/routing";
- import { Response } from "@/types";
- import { cookies } from "next/headers";
- import { ServerOptions } from "./type";
- const requestInterceptor = (options: ServerOptions) => {
- // 判断token
- if (options.checkToken) {
- const token = cookies().has("Token");
- if (!token) {
- redirect({ href: "/login", locale: "en" });
- }
- }
- return options;
- };
- const responseInterceptor = <T = any, R = unknown>(
- response: Response<T> & R,
- options: ServerOptions,
- url: string
- ): Promise<Response<T> & R> => {
- return new Promise((resolve, reject) => {
- const { code, msg } = response;
- switch (code) {
- case 200:
- resolve(response);
- break;
- case 401:
- console.log(`🚀🚀🚀🚀🚀->server-code: 401`, options.url);
- redirect({ href: "/login", locale: "en" });
- break;
- case 500:
- reject(response);
- break;
- default:
- console.log({
- ...response,
- ...options,
- message: `please check api ${url}${options.url}`,
- });
- resolve(response);
- }
- });
- };
- class Server {
- private static instance: Server;
- private BASE_URL: string;
- constructor() {
- this.BASE_URL = process.env.NEXT_PUBLIC_BASE_URL as string;
- }
- async request<T, R = unknown>(options: ServerOptions): Promise<Response<T> & R> {
- options = requestInterceptor(options);
- const { method = "GET", url, headers = {}, data = {}, body, ...other } = options;
- const params = JSON.stringify(data);
- try {
- const response = await fetch(`${this.BASE_URL}${url}`, {
- method: method,
- headers: {
- Token: cookies().get("Token")?.value || "",
- "Content-Type": "application/json",
- language:
- cookies().get("language")?.value || cookies().get("NEXT_LOCALE")?.value,
- ...headers,
- },
- body: params,
- ...other,
- })
- .then((res) => res.json())
- .catch((error) => {
- console.log(`🚀🚀🚀🚀🚀-> in index.ts on 68`, error);
- return {};
- });
- return responseInterceptor<T, R>(response, options, this.BASE_URL);
- } catch (error) {
- console.log(
- `🚀🚀🚀🚀🚀-> in index.ts on 67`,
- error,
- `${this.BASE_URL}${options.url}`,
- JSON.stringify(options)
- );
- return Promise.reject(error);
- }
- }
- }
- export const server = new Server();
|