11

I've deployed a VueJS project to a domain like www.example.com/demos/app, But when I send a request to api from axios it is pointing to www.example.com/login instead of www.example.com/demos/app/login

Here is my request code using axios

export const login = ({ dispatch }, { payload, context }) => {
    return axios.post('/login', payload).then((response) => {
        // do something
    }).catch((error) => {
        // handle erros
    })
}
Naresh
  • 862
  • 3
  • 12
  • 35

5 Answers5

25

One way you could go about this is to add a meta tag to the head of your page (like you may do with the csrf) and then reference it in your bootstrap.js file:

head

<meta name="api-base-url" content="{{ url('demos/app') }}" />

bootstrap.js (underneath window.axios = require('axios');)

window.axios.defaults.baseURL = document.head.querySelector('meta[name="api-base-url"]').content;

Hope this helps!

Rwd
  • 34,180
  • 6
  • 64
  • 78
  • document.head.querySelector('meta[name="api-base-url"]').content; this will cause problem during tests (vue testing), – Emeka Mbah Feb 28 '21 at 15:02
  • @EmekaMbah Does this question solve your problem: https://stackoverflow.com/questions/49820828/during-testing-a-vue-component-in-jest-document-queryselector-always-returns-nul? – Rwd Mar 01 '21 at 08:03
5

In config.js:

const CONFIG = {
  API_URL_ROOT: 'http://localhost:8000/api/v1/',
}

export default CONFIG;

You can set axios default like this:

import config from '../config.js';

axios.create({
  baseURL: config.API_BASE_URL
});

Or you can just set path by importing API_BASE_URL from config and then point it each time you make a get/post/put/delete call using axios

Nafiul Islam
  • 1,220
  • 8
  • 20
4

Laravel ships with axios and its imported in bootstrap.js, so simply go to bootstrap.js and add this:

window.axios.defaults.baseURL = 'http://example.test';

You can add this after window.axios.defaults.headers.common line

-Additional information:

axios.create will make an instance that has its own global url and configurations. use this if you have multiple urls or configuration and you want to use it in different components.

Pooria Honarmand
  • 773
  • 8
  • 17
0

Create vue.config.js in Project root directory( if not exist ) -

In vue.config.js -

module.exports = {
    publicPath: process.env.NODE_ENV === 'production'
        ? '/demos/app/'
        : '/'
}

Then, Add the line in resources/js/bootstrap.js -

const {publicPath} = require("../../vue.config");
window.axios.defaults.baseURL = publicPath
Sanaulla
  • 1,329
  • 14
  • 13
0

.env

MIX_APP_URL="${APP_URL}"

resources/js/bootstrap.js

window.axios = require('axios');
window.axios.defaults.baseURL = process.env.MIX_APP_URL;

Update your APP_URL in .env file and add the above code on respective files.

Shrestharikesh
  • 820
  • 7
  • 13