Задача такая: Я делаю запросы с помощью
axios
к серверу. С помощью
catch
лювлю ошибки и если API ответа 401 Unauthorized нужно переадресовывать пользователя на страницу авторизации; при получения от API ответа 403 Forbidden пользователю необходимо показать модальное окно с надписью “Доступ запрещен”
Есть ли способ отлавливать их в одном месте?
Использую axios, vue.js, vue-router. Показ любой модалки у меня сделан так, чтобы ей передавалось св-во даты modal = true и она показывалась.
Сейчас у меня отдельным файлом config настроин любой запрос к API
import axios from 'axios'
import api_config from '../../api_config'
function request(method, url, params, data) {
let axios_config = {
// `baseURL` is the server URL that will be used for the request
baseURL: api_config.api_url,
// `method` is the request method to be used when making the request
method: method,
// `url` will be prepended to `baseURL` unless `baseURL` is absolute.
url: url,
headers: {
Authorization: 'Bearer ' + api_config.api_token
}
}
if (params) {
// `params` are the URL parameters to be sent with the request
axios_config.params = params
}
if (data) {
// `data` allows changes to the request data before it is sent to the server
// This is only applicable for request methods 'PUT', 'POST', and 'PATCH'
axios_config.data = data
}
// intercept responses before they are handled by then or catch
axios.interceptors.response.use((response) => {
console.log('response', response)
return response
}, (error) => {
if (error.response.status == 401) {
this.$router.push({ path: '/login' })
}
console.log('1111error', error.response.status)
// return Promise.reject(error);
})
return axios(axios_config)
}
function get(url) {
return request('get', url, null, null)
}
function post(url, data) {
data = data || {}
return request('post', url, null, data)
}
function put(url, data) {
data = data || {}
return request('put', url, null, data)
}
function remove(url) {
return request('delete', url, null, null)
}
export default {get, post, put, remove, request}
Пробовала редеректить с помощью
axios.interceptors.response.use
и
this.$router.push({ path: '/login' })
но получаю ошибку
TypeError: Cannot read property '$router' of undefined
at __WEBPACK_IMPORTED_MODULE_0_axios___default.a.interceptors.response.use
вот думаю может есть другой способ