如何在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 相关文章推荐
JavaScript 动态生成方法的例子
Jul 22 Javascript
Ruffy javascript 学习笔记
Nov 30 Javascript
JavaScript中yield实用简洁实现方式
Jun 12 Javascript
JS实现一个列表中包含上移下移删除等功能
Sep 24 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
Oct 27 Javascript
jQuery实现radio第一次点击选中第二次点击取消功能
May 15 jQuery
JS数组操作之增删改查的简单实现
Aug 21 Javascript
jQuery实现点击下拉框中的值累加到文本框中的方法示例
Oct 28 jQuery
element-ui 限制日期选择的方法(datepicker)
May 16 Javascript
angular中子控制器向父控制器传值的实例
Oct 08 Javascript
layui table 获取分页 limit的方法
Sep 20 Javascript
利用JS判断元素是否为数组的方法示例
Jan 08 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
Windows和Linux中php代码调试工具Xdebug的安装与配置详解
2014/05/08 PHP
php输出含有“#”字符串的方法
2017/01/18 PHP
PHP单例模式与工厂模式详解
2017/08/29 PHP
Autocomplete Textbox Example javascript实现自动完成成功
2007/08/17 Javascript
getElementByIdx_x js自定义getElementById函数
2012/01/24 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
javascript中几个容易混淆的概念总结
2015/04/14 Javascript
js判断图片加载完成后获取图片实际宽高的方法
2016/02/25 Javascript
js将滚动条滚动到指定位置的简单实现方法
2016/06/25 Javascript
Vue-cli3项目配置Vue.config.js实战记录
2018/07/29 Javascript
小程序getLocation需要在app.json中声明permission字段
2019/04/04 Javascript
Electron + vue 打包桌面操作流程详解
2019/06/24 Javascript
Node 代理访问的实现
2019/09/19 Javascript
使用layer弹窗提交表单时判断表单是否输入为空的例子
2019/09/26 Javascript
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
[01:13:18]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.23
2019/09/05 DOTA
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Python中的字典与成员运算符初步探究
2015/10/13 Python
你眼中的Python大牛 应该都有这份书单
2017/10/31 Python
python实现在遍历列表时,直接对dict元素增加字段的方法
2019/01/15 Python
Apache,wsgi,django 程序部署配置方法详解
2019/07/01 Python
django的聚合函数和aggregate、annotate方法使用详解
2019/07/23 Python
python3.7环境下安装Anaconda的教程图解
2019/09/10 Python
tensorflow之并行读入数据详解
2020/02/05 Python
Python连接Hadoop数据中遇到的各种坑(汇总)
2020/04/14 Python
关于Python3爬虫利器Appium的安装步骤
2020/07/29 Python
英国婴儿产品专家:Samuel Johnston
2020/04/20 全球购物
小组合作学习反思
2014/02/18 职场文书
公开服务承诺制度
2014/03/26 职场文书
公司应聘求职信
2014/06/21 职场文书
法定代表人身份证明书
2014/09/10 职场文书
党员群众路线剖析材料
2014/10/08 职场文书
2015年政治教研组工作总结
2015/07/22 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL
关于SpringBoot 使用 Redis 分布式锁解决并发问题
2021/11/17 Redis
git中cherry-pick命令的使用教程
2022/06/25 Servers