先重新封裝 axios 的用法。並且一開始先不打算開放使用 axios 原生功能。
希望可以讓
GET: API.GET(url, params)
其它的就照 axios 原本的寫法,DELETE 不能用 body
有一次,案子還是在 DELETE 的 API 帶 body。就把 DELETE 另外用
fetch實作,而不是用 axios 。但也因為有下面這樣的寫法,所以可以共用 host 或 header。
下面的程式碼,放在同一個檔案src/utitlity/backendAPI.js
src/utitlity/backendAPI.js
import axios from 'axios';
const backendAPI = axios.create({
  baseURL: `http://127.0.0.1`,
  headers: {
    'Content-Type': 'application/json',
    Accept: 'application/json'
  }
});
let token = null;
在此是 request 的 interceptors。
負責處理「在送出 API 之前」的事,要添加 token
backendAPI.interceptors.request.use(
  config => {
    // Do something before request is sent
    if (token) {
      config.headers['Authorization'] = `Bearer ${token}`;
    }
    return config;
  },
  function(error) {
    // Do something with request error
    return Promise.reject(error);
  }
);
處理 response 的部份,會放在
new Vue()的created()的 lifecycle 處理。
大致上分成兩個部份。
export default {
  async login({ user, password }) {
    const res = await backendAPI.post('/login', {
      user,
      password
    })
    token = res.data.token
    return Promise.reject(res.data);
  },
  async formDataPOST(url, data, config) {
    try {
      const form = new FormData();
      for (let key in data) {
        form.append(key, data[key]);
      }
      const res = await backendAPI.post(url, form, {
        headers: {
          'Content-Type': 'multipart/form-data'
        },
        ...config
      });
      return res.data;
    } catch (res) {
      return Promise.reject(res.data);
    }
  },
  async GET(url, params) {
    try {
      const res = await backendAPI.get(url, {
        params
      });
      return res.data;
    } catch (res) {
      return Promise.reject(res.data);
    }
  },
  async POST(...arge) {
    try {
      const res = await backendAPI.post(...arge);
      return res.data;
    } catch (res) {
      return Promise.reject(res.data);
    }
  },
  async PUT(...arge) {
    try {
      const res = await backendAPI.put(...arge);
      return res.data;
    } catch (res) {
      return Promise.reject(res.data);
    }
  },
  async DELETE(url, params) {
    try {
      const res = await backendAPI.delete(url, {
        params
      });
      return res.data;
    } catch (res) {
      return Promise.reject(res.data);
    }
  }
};
在此會處理 API 回覆不是 200 的錯誤,初步處理將程式流程導到處理錯誤的流程。並且回傳適合的資料層次。
有些後端,會在出錯時給這種格式,不知道是不是框架預設值
{
  "data": ""
}
有些後端,會在出錯時給另一種格式
{
  "detail": "",
  "code": 123
}
為了適應各種後端,所以希望可以處理各種後端送過來的資料。
不過同一個後端應該會送相同的錯誤處理格式。
const token = null; 應該是 let?
然後login的部份好像少了try...catch的區塊
(剛剛測試的時候token = res.data.token那邊出錯,然後進了Promise.reject(res.data);,但因為這個錯誤沒有data這個屬性,印不出真正的錯誤訊息,所以找了很久才找到是變數宣告問題XDD)
你是對的
token 用 let 宣告