如何在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 相关文章推荐
cnblogs中在闪存中屏蔽某人的实现代码
Nov 14 Javascript
Javascript绝句欣赏 一些经典的js代码
Feb 22 Javascript
js自动闭合html标签(自动补全html标记)
Oct 04 Javascript
javascript动态的改变IFrame的高度实现自动伸展
Oct 12 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
Nov 28 Javascript
jQuery插件实现大图全屏图片相册
Mar 14 Javascript
jQuery easyui的validatebox校验规则扩展及easyui校验框validatebox用法
Jan 18 Javascript
js 实现获取name 相同的页面元素并循环遍历的方法
Feb 14 Javascript
VUE开发一个图片轮播的组件示例代码
Mar 06 Javascript
关于react中组件通信的几种方式详解
Dec 10 Javascript
Javascript中从学习bind到实现bind的过程
Jan 05 Javascript
es6 filter() 数组过滤方法总结
Apr 03 Javascript
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
一家之言的经验之谈php+mysql扎实个人基本功
2008/03/27 PHP
PHP中MD5函数使用实例代码
2008/06/07 PHP
Yii框架关联查询with用法分析
2014/12/02 PHP
PHP中仿制 ecshop验证码实例
2017/01/06 PHP
showModelessDialog()使用详解
2006/09/21 Javascript
JS 时间显示效果代码
2009/08/23 Javascript
Extjs学习笔记之七 布局
2010/01/08 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
js图片预加载示例
2014/04/30 Javascript
详谈JavaScript内存泄漏
2014/11/14 Javascript
常用原生JS兼容性写法汇总
2016/04/27 Javascript
AngularJS基础 ng-copy 指令实例代码
2016/08/01 Javascript
JavaScript数据结构之二叉树的计数算法示例
2017/04/13 Javascript
EasyUI在Panel上动态添加LinkButton按钮
2017/08/11 Javascript
Canvas放置反弹效果随机图形(实例)
2017/08/17 Javascript
详解javascript appendChild()的完整功能
2018/08/18 Javascript
layui弹出层按钮提交iframe表单的方法
2018/08/20 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
Python解析树及树的遍历
2016/02/03 Python
Python使用folium excel绘制point
2019/01/03 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
python实现两个一维列表合并成一个二维列表
2019/12/02 Python
Python线程障碍对象Barrier原理详解
2019/12/02 Python
使用python3 实现插入数据到mysql
2020/03/02 Python
Python3压缩和解压缩实现代码
2021/03/01 Python
使用CSS3创建动态菜单效果
2015/07/10 HTML / CSS
社区食品安全实施方案
2014/03/28 职场文书
单位委托书范本
2014/04/04 职场文书
大学学习计划书范文
2014/05/02 职场文书
多媒体教室标语
2014/06/26 职场文书
小学四年级学生评语
2014/12/26 职场文书
村官个人总结范文
2015/03/03 职场文书
民事代理词范文
2015/05/25 职场文书
信用卡收入证明范本
2015/06/12 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android
在ubuntu下安装go开发环境的全过程
2022/08/05 Golang