vue 开发和生产的跨域问题

开发阶段

  在开发环境与后端调试的时候难免会遇到跨域问题,在 vue 项目中常用的是 proxyTable,这个用起来很方便。

  打开 config 文件夹下面的 index.js,找到 dev 开发模式的 proxyTable,添加以下代码即可:

        proxyTable: {
            '/api': {
                target: 'http://xxx.xxx.xxx/', // 接口的域名
                changeOrigin: true, // 在本地会创建一个虚拟服务端,然后发送请求的数据,并同时接收请求的数据,这样服务端和服务端进行数据的交互就不会有跨域问题
          secure: true, // 如果是https接口,需要配置这个参数
                pathRewrite: { // 路径重写,
                    '^/api': '/api' // 替换target中的请求地址,也就是说以后你在请求http://api.jisuapi.com/XXXXX这个地址的时候直接写成/api/XXXXX即可。
                }
            }
        },

  在需要调用的接口前加上 "/api" 即可

const menu = (params) => {
  return axios.get("/api/menu",params).then(res => res.data)
};

  

生产阶段

  情况一:接口有统一的命名

  在项目打包上线时,代码里的请求地址不需要改动,

  线上代码运行时,就不会使用代理了,碰到 axios.get('/api/menu') 请求,因为在 api 的前面有个 "/" ,表示根目录的意思,

  所以 "/api/menu" 会被解析为 hostname+port+"api/menu" ,所以请求地址就为 "www.xxx.com:8080/api/menu"。

  这里有一个问题,就是这个 api 也在路径中

  解决方案就是在设计接口的时候,就把 "api" 也写进接口中,并且为域名后的第一层。也可以自定义命名(比如项目名),然后在开发模式的 proxyTable 里,也设置成这个自定义的命名就好了。

扫描二维码关注公众号,回复: 4166772 查看本文章

  情况二:接口没有统一的命名

  还是这个路径 "www.xxx.com:8080/api/menu" 中的 api ,如果真实接口中没有 api 这一层,路径就会报错。真实接口是 "www.xxx.com:8080/menu"

  解决方案:分别区分两种模式,然后拼接接口,具体如下。

const rootUrl = process.env.NODE_ENV === 'development' ? '/api' : '';

const menu = (params) => {
    return axios.get(rootUrl + '/menu', params).then(res => res.data)
};

  

  还可以分别在 /config/dev.env.js 和 /config/prod.env.js 中分别设置 API_ROOT,然后取出再做接口的拼接。

//config/dev.env.js
module.exports = merge(prodEnv, {
    NODE_ENV: '"development"',
    API_ROOT: '"/api"'
})

//config/prod.env.js
module.exports = {
    NODE_ENV: '"production"',
    API_ROOT: '"http://baidu.xxx.com/"'
}

//在接口调用的时候拼接
const rootUrl = process.env.API_ROOT;

const menu = (params) => {
    return axios.get(rootUrl + '/menu', params).then(res => res.data)
};

猜你喜欢

转载自www.cnblogs.com/sspeng/p/9992430.html