E-Trans Documentation
Developed by Pratik Dimble | Tested by Swapnil Kharat Contact Me

๐Ÿ”น Axios API Client Setup

import axios from 'axios'
import { API_BASE_URL } from '@/urlconfig.js'
import { useAuthStore } from '@/stores/auth'
const apiClient = axios.create({
  baseURL: API_BASE_URL,
  headers: { 'Content-Type': 'application/json' },
  timeout: 30000,
})

๐Ÿ”น Request Interceptor

apiClient.interceptors.request.use(config => {
  const authStore = useAuthStore()
  if (authStore.token) config.headers.Authorization = `Bearer ${authStore.token}`
  return config
})

๐Ÿ”น Response Interceptor (Token Refresh)

Handles expired tokens and retries failed requests safely.

let isRefreshing = false
let failedQueue = []

Key Logic

  1. Skip refresh for auth endpoints:
if (originalRequest.url?.includes('/auth/login') ||
    originalRequest.url?.includes('/auth/register') ||
    originalRequest.url?.includes('/auth/refresh')) {
  return Promise.reject(error)
}
  1. Handle 401 (Unauthorized):
if (error.response?.status === 401 && !originalRequest._retry) {
  if (!authStore.refreshToken) {
    authStore.clearAuth()
    return Promise.reject(error)
  }
  1. Queue requests during refresh:
if (isRefreshing) {
  return new Promise((resolve, reject) => {
    failedQueue.push({ resolve, reject })
  }).then(token => {
    originalRequest.headers.Authorization = `Bearer ${token}`
    return apiClient(originalRequest)
  })
}
  1. Perform token refresh:
const res = await apiClient.post('/auth/refresh', {
  refreshToken: authStore.refreshToken
})
const newAccessToken = res.data.accessToken
authStore.setToken(newAccessToken)
processQueue(null, newAccessToken)
  1. Retry the original request:
originalRequest.headers.Authorization = `Bearer ${newAccessToken}`
return apiClient(originalRequest)
  1. Handle refresh failure:
processQueue(err, null)
authStore.clearAuth()
return Promise.reject(err)

โœ… Advantages of This Approach