/* Basic example of save cookie using axios in node.js and recreate session if it expired. * Get/save cookie manually cause WithCredential axios param use XHR and not work in node.js * Supports parallel request and send only one create session request. * */ const BASE_URL = "https://google.com"; // Init instance of axios which works with BASE_URL const axiosInstance = axios.create({ baseURL: BASE_URL }); const createSession = async () => { console.log("create session"); const authParams = { username: "username", password: "password" }; const resp = await axios.post(BASE_URL, authParams); const [cookie] = resp.headers["set-cookie"]; // get cookie from request axiosInstance.defaults.headers.Cookie = cookie; // attach cookie to axiosInstance for future requests return cookie; // return Promise cause func is async }; let isGetActiveSessionRequest = false; let requestQueue = []; const callRequestsFromQueue = cookie => { requestQueue.forEach(sub => sub(cookie)); }; const addRequestToQueue = sub => { requestQueue.push(sub); }; const clearQueue = () => { requestQueue = []; }; // register axios interceptor which handle responses errors axiosInstance.interceptors.response.use(null, error => { console.error(error.message); //logging here const { response = {}, config: sourceConfig } = error; // check if request failed cause Unauthorized if (response.status === 401) { // if this request is first we set isGetActiveSessionRequest flag to true and run createSession if (!isGetActiveSessionRequest) { isGetActiveSessionRequest = true; createSession().then(cookie => { // when createSession resolve with cookie value we run all request from queue with new cookie isGetActiveSessionRequest = false; callRequestsFromQueue(cookie); clearQueue(); // and clean queue }).catch(e => { isGetActiveSessionRequest = false; // Very important! console.error('Create session error %s', e.message); clearQueue(); }); } // and while isGetActiveSessionRequest equal true we create and return new promise const retryRequest = new Promise(resolve => { // we push new function to queue addRequestToQueue(cookie => { // function takes one param 'cookie' console.log("Retry with new cookie %s request to %s", method, url); sourceConfig.headers.Cookie = cookie; // set cookie to header resolve(axios(sourceConfig)); // and resolve promise with axios request by old config with cookie // we resolve exactly axios request - NOT axiosInstance request cause it could call recursion }); }); return retryRequest; } else { // if error is not related with Unauthorized we reject promise return Promise.reject(error); } });