如何在vue里面优雅的解决跨域(路由冲突问题)


Posted in Javascript onJanuary 20, 2019

如何在vue里面优雅的解决跨域,路由冲突问题

当我们在路由里面配置成以下代理可以解决跨域问题

proxyTable: {
   '/goods/*': {
    target: 'http://localhost:3000'
   },
   '/users/*': {
    target: 'http://localhost:3000'
   }
  },

这种配置方式在一定程度上解决了跨域问题,但是会带来一些问题,

比如我们的vue 路由 也命名为 goods,这时候就会产生了冲突,

如果项目中接口很多,都在这里配置是很麻烦的,也容易产生路由冲突。

正确的姿势

如果把所有的接口,统一规范为一个入口,在一定程度上会解决冲突

把以上配置统一前面加上 /api/

proxyTable: {
   '/api/**': {
    target: 'http://localhost:3000'
   },
  },

如果我们配置成这种方式,在使用http请求的时候就会发生变化,会在请求前面加上一个api,相对路由也会发生变化,也会在接口前面加上api,这样也会很麻烦,我们可以使用以下方式来解决这个问题

proxyTable: {
   '/api/**': {
    target: 'http://localhost:3000',
    pathRewrite:{
     '^/api':'/'
    }
   },
  },

上面这个代码,就是把咱们虚拟的这个api接口,去掉,此时真正去后端请求的时候,不会加上api这个前缀了,那么这样我们前台http请求的时候,还必须加上api前缀才能匹配到这个代理,代码如下:

logout(){
  axios.post('/api/users/logout').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 },
 getGoods(){
  axios.post('/api/goods/list').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 }

我们可以利用axios的baseUrl直接默认值是 api,这样我们每次访问的时候,自动补上这个api前缀,就不需要我们自己手工在每个接口上面写这个前缀了

在入口文件里面配置如下:

import Axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, Axios)
Axios.defaults.baseURL = 'api'

如果这配置 'api/' 会默认读取本地的域

上面这样配置的话,不会区分生产和开发环境

在config 文件夹里面新建一个 api.config.js 配置文件

const isPro = Object.is(process.env.NODE_ENV, 'production')

module.exports = {
 baseUrl: isPro ? 'http://www.vnshop.cn/api/' : 'api/'
}

然后在main.js 里面引入,这样可以保证动态的匹配生产和开发的定义前缀

import apiConfig from '../config/api.config'

import Axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, Axios)
Axios.defaults.baseURL = apiConfig.baseUrl

经过上面配置后,在dom里面可以这样轻松的访问,也不需要在任何组件里面引入axios模块了。

logout(){
  this.$http.post('/users/logout').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 },
 getGoods(){
  this.$http.post('/goods/list').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 }

最终代码

在代理里面配置
 

proxyTable: {
   '/api/**': {
    target: 'http://localhost:3000',
    pathRewrite:{
     '^/api':'/'
    }
   },
  },

在config里面的api.config.js 配置

在config 文件夹里面新建一个 api.config.js 配置文件

const isPro = Object.is(process.env.NODE_ENV, 'production')

module.exports = {
 baseUrl: isPro ? 'http://www.vnshop.cn/api/' : 'api/'
}

关于生产和开发配置不太了解

可以去 dev-server.js 里面看配置代码

const webpackConfig = (process.env.NODE_ENV === 'testing' || process.env.NODE_ENV === 'production') ?
 require('./webpack.prod.conf') :
 require('./webpack.dev.conf')

在main.js 入口文件里面配置

import apiConfig from '../config/api.config'

import Axios from 'axios'
import VueAxios from 'vue-axios'

Vue.use(VueAxios, Axios)
Axios.defaults.baseURL = apiConfig.baseUrl
在dom里面请求api的姿势
 logout(){
  this.$http.post('/users/logout').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 },
 getGoods(){
  this.$http.post('/goods/list').then(result=>{
   let res = result.data;
   this.nickName = '';
   console.log(res);
  })
 }

vuejs项目生产环境,上线解决跨域问题,请看以下文章

vue项目上线 看看这个文章,专门讲上线的

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
求解开jscript.encode代码的asp函数
Feb 28 Javascript
JavaScript 数组的 uniq 方法
Jan 23 Javascript
fmt:formatDate的输出格式详解
Jan 09 Javascript
通过JS动态创建一个html DOM元素并显示
Oct 15 Javascript
JavaScript使用指针操作实现约瑟夫问题实例
Apr 07 Javascript
javascript操作ul中li的方法
May 14 Javascript
js结合正则实现国内手机号段校验
Jun 19 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
Mar 07 Javascript
js改变css样式的三种方法推荐
Jun 28 Javascript
激动人心的 Angular HttpClient的源码解析
Jul 10 Javascript
vue.js框架实现表单排序和分页效果
Aug 09 Javascript
jQuery选择器之基本过滤选择器用法实例分析
Feb 19 jQuery
JavaScript禁用右键单击优缺点分析
Jan 20 #Javascript
JavaScript中concat复制数组方法浅析
Jan 20 #Javascript
JavaScript中import用法总结
Jan 20 #Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 #Javascript
js序列化和反序列化的使用讲解
Jan 19 #Javascript
vue-router传参用法详解
Jan 19 #Javascript
vue-router实现嵌套路由的讲解
Jan 19 #Javascript
You might like
基于empty函数的输出详解
2013/06/17 PHP
利用PHP自动生成印有用户信息的名片
2016/08/01 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
关于JavaScript的gzip静态压缩方法
2007/01/05 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
DIV+CSS+JS不间断横向滚动实现代码
2013/03/19 Javascript
node.js学习总结之调式代码的方法
2014/06/25 Javascript
jQuery验证元素是否为空的两种常用方法
2015/03/17 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
jQuery实现灰蓝风格标准二级下拉菜单效果代码
2015/08/31 Javascript
实现高性能JavaScript之执行与加载
2016/01/30 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
jQuery中each和js中forEach的区别分析
2019/02/27 jQuery
vuex实现及简略解析(小结)
2019/03/01 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
vue中使用vue-print.js实现多页打印
2020/03/05 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
研究Python的ORM框架中的SQLAlchemy库的映射关系
2015/04/25 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
2017/12/12 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
python spyder中读取txt为图片的方法
2018/04/27 Python
python3 判断列表是一个空列表的方法
2018/05/04 Python
Python之list对应元素求和的方法
2018/06/28 Python
JSON文件及Python对JSON文件的读写操作
2018/10/07 Python
python3.6 如何将list存入txt后再读出list的方法
2019/07/02 Python
python路径的写法及目录的获取方式
2019/12/26 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
python实现简单飞行棋
2020/02/06 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
利用CSS3的transform做的动态时钟效果
2011/09/21 HTML / CSS
专门出售各种儿童读物的网站:Put Me In The Story
2016/08/07 全球购物
美国眼镜网:GlassesUSA
2017/09/07 全球购物
班长自荐书范文
2014/02/11 职场文书