如何在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 相关文章推荐
jQuery 创建Dom元素
May 07 Javascript
Javascript动态引用CSS文件的2种方法介绍
Jun 06 Javascript
jQuery中removeClass()方法用法实例
Jan 05 Javascript
js检测用户输入密码强度
Oct 22 Javascript
Bootstrap打造一个左侧折叠菜单的系统模板(一)
May 17 Javascript
浅谈JS如何实现真正的对象常量
Jun 25 Javascript
详解javascript中的变量提升和函数提升
May 24 Javascript
vue异步axios获取的数据渲染到页面的方法
Aug 09 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
Jul 08 Javascript
如何实现js拖拽效果及原理解析
May 08 Javascript
微信小程序语音同步智能识别的实现案例代码解析
May 29 Javascript
Vue环境搭建+VSCode+Win10的详细教程
Aug 19 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函数)
2006/10/09 PHP
mysql_fetch_assoc和mysql_fetch_row的功能加起来就是mysql_fetch_array
2007/01/15 PHP
php表单处理操作
2017/11/16 PHP
用js判断用户浏览器是否是XP SP2的IE6
2007/03/08 Javascript
javascript 学习之旅 (1)
2009/02/05 Javascript
html5 canvas js(数字时钟)实例代码
2013/12/23 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
2014/08/22 Javascript
原生JS和JQuery动态添加、删除表格行的方法
2015/05/28 Javascript
学习JavaScript设计模式(封装)
2015/11/26 Javascript
JavaScript程序开发之JS代码放置的位置
2016/01/15 Javascript
Bootstrap项目实战之首页内容介绍(全)
2016/04/25 Javascript
快速实现JS图片懒加载(可视区域加载)示例代码
2017/01/04 Javascript
jQuery列表检索功能实现代码
2017/07/17 jQuery
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
从零搭一个自用的前端脚手架的方法步骤
2019/09/23 Javascript
浅谈使用nodejs搭建web服务器的过程
2020/07/20 NodeJs
[33:15]2018DOTA2亚洲邀请赛3月30日 小组赛B组 VP VS Mineski
2018/03/31 DOTA
深入讲解Python中面向对象编程的相关知识
2015/05/25 Python
常用python编程模板汇总
2016/02/12 Python
Python遍历文件夹和读写文件的实现代码
2016/08/28 Python
Python判断文件和字符串编码类型的实例
2017/12/21 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
Python2.7版os.path.isdir中文路径返回false的解决方法
2019/06/21 Python
python二维码操作:对QRCode和MyQR入门详解
2019/06/24 Python
使用pyhon绘图比较两个手机屏幕大小(实例代码)
2020/01/03 Python
python如何删除列为空的行
2020/07/17 Python
Python3中的tuple函数知识点讲解
2021/01/03 Python
仿酷狗html5手机音乐播放器主要部分代码
2013/05/15 HTML / CSS
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
优秀体育委员自荐书
2014/01/31 职场文书
医院保洁服务方案
2014/06/11 职场文书
党的群众路线教育实践活动整改落实情况报告
2014/10/28 职场文书
电影地道战观后感
2015/06/04 职场文书
领导干部学习三严三实心得体会
2016/01/05 职场文书
Golang 实现 WebSockets 之创建 WebSockets
2022/04/24 Golang