From 795f256bded1a2a8ba5124380272435b495d5ebb Mon Sep 17 00:00:00 2001 From: Dream Hunter Date: Mon, 27 Nov 2023 18:00:49 +0800 Subject: [PATCH] fix: loading forever (#35) --- frontend/package.json | 1 + frontend/pnpm-lock.yaml | 64 +++++++++++++++++++++++++++++++++++++++ frontend/src/api/index.js | 14 ++++++--- 3 files changed, 75 insertions(+), 4 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 4d09599c..ac7fd1c5 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,6 +10,7 @@ }, "dependencies": { "@vueuse/core": "^10.1.2", + "axios": "^1.6.2", "naive-ui": "^2.34.3", "vue": "^3.3.4", "vue-clipboard3": "^2.0.0", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index e9ef2da2..2be05203 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -8,6 +8,9 @@ dependencies: '@vueuse/core': specifier: ^10.1.2 version: 10.1.2(vue@3.3.4) + axios: + specifier: ^1.6.2 + version: 1.6.2 naive-ui: specifier: ^2.34.3 version: 2.34.3(vue@3.3.4) @@ -462,6 +465,20 @@ packages: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} dev: false + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /axios@1.6.2: + resolution: {integrity: sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + /clipboard@2.0.11: resolution: {integrity: sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==} dependencies: @@ -470,6 +487,13 @@ packages: tiny-emitter: 2.1.0 dev: false + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + /css-render@0.15.12: resolution: {integrity: sha512-eWzS66patiGkTTik+ipO9qNGZ+uNuGyTmnz6/+EJIiFg8+3yZRpnMwgFo8YdXhQRsiePzehnusrxVvugNjXzbw==} dependencies: @@ -499,6 +523,11 @@ packages: '@babel/runtime': 7.22.10 dev: false + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + /delegate@3.2.0: resolution: {integrity: sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==} dev: false @@ -540,6 +569,25 @@ packages: resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==} dev: false + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -573,6 +621,18 @@ packages: dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + /naive-ui@2.34.3(vue@3.3.4): resolution: {integrity: sha512-fUMr0dzb/iGsOTWgoblPVobY5X5dihQ1eam5dA+H74oyLYAvgX4pL96xQFPBLIYqvyRFBAsN85kHN5pLqdtpxA==} peerDependencies: @@ -615,6 +675,10 @@ packages: picocolors: 1.0.0 source-map-js: 1.0.2 + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + dev: false + /regenerator-runtime@0.14.0: resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} dev: false diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index 4a0f6a97..a4e1aa58 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -1,12 +1,18 @@ import { useGlobalState } from '../store' +import axios from 'axios' const API_BASE = import.meta.env.VITE_API_BASE || ""; const { loading, auth, jwt, openSettings, showAuth, adminAuth, showAdminAuth } = useGlobalState(); +const instance = axios.create({ + baseURL: API_BASE, + timeout: 10000 +}); + const apiFetch = async (path, options = {}) => { loading.value = true; try { - const response = await fetch(`${API_BASE}${path}`, { + const response = await instance.request(path, { method: options.method || 'GET', headers: { 'x-custom-auth': auth.value, @@ -23,10 +29,10 @@ const apiFetch = async (path, options = {}) => { showAdminAuth.value = true; throw new Error("Unauthorized"); } - if (!response.ok) { - throw new Error(`${response.status} ${await response.text()}` || "error"); + if (response.status >= 300) { + throw new Error(`${response.status} ${response.data}` || "error"); } - const data = await response.json(); + const data = response.data; return data; } finally { loading.value = false;