如何在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系列(11) 执行上下文(Execution Contexts)
Jan 15 Javascript
可恶的ie8提示缺少id未定义
Mar 20 Javascript
深入分析escape()、encodeURI()、encodeURIComponent()的区别及示例
Aug 04 Javascript
js+csss实现的一个带复选框的下拉框
Sep 29 Javascript
JavaScript实现重置表单(reset)的方法
Apr 02 Javascript
JavaScript实现复制文章自动添加版权
Aug 02 Javascript
详解vue-router 2.0 常用基础知识点之router-link
May 10 Javascript
基于es6三点运算符的使用方法(实例讲解)
Oct 12 Javascript
AngularJS 监听变量变化的实现方法
Oct 09 Javascript
解决js相同的正则多次调用test()返回的值却不同的问题
Oct 10 Javascript
Vue中UI组件库之Vuex与虚拟服务器初识
May 07 Javascript
微信小程序学习总结(五)常见问题实例小结
Jun 04 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
评分9.0以上的动画电影,剧情除了经典还很燃
2020/03/04 日漫
变量在 PHP7 内部的实现(二)
2015/12/21 PHP
php mysql_real_escape_string addslashes及mysql绑定参数防SQL注入攻击
2016/12/23 PHP
浅谈thinkphp5 instance 的简单实现
2017/07/30 PHP
PHP基于Closure类创建匿名函数的方法详解
2017/08/17 PHP
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
JavaScript中原型和原型链详解
2015/02/11 Javascript
js实现键盘Enter键提交表单的方法
2015/05/27 Javascript
js实现向右横向滑出的二级菜单效果
2015/08/27 Javascript
js老生常谈之this,constructor ,prototype全面解析
2016/04/05 Javascript
利用Jquery队列实现根据输入数量显示的动画
2016/09/01 Javascript
JavaScript订单操作小程序完整版
2017/06/23 Javascript
Angular通过angular-cli来搭建web前端项目的方法
2017/07/27 Javascript
从零开始实现Vue简单的Toast插件
2018/12/03 Javascript
Vue2.0+Vux搭建一个完整的移动webApp项目的示例
2019/03/19 Javascript
微信小程序实现Session功能及无法获取session问题的解决方法
2019/05/07 Javascript
layer弹出层自适应高度,垂直水平居中的实现
2019/09/16 Javascript
JavaScript交换变量的常用方法小结【4种方法】
2020/05/07 Javascript
Vue.js中使用Vuex实现组件数据共享案例
2020/07/31 Javascript
vue 公共列表选择组件,引用Vant-UI的样式方式
2020/11/02 Javascript
使用Vant完成DatetimePicker 日期的选择器操作
2020/11/12 Javascript
零基础写python爬虫之爬虫框架Scrapy安装配置
2014/11/06 Python
python3 模拟登录v2ex实例讲解
2017/07/13 Python
Python爬虫包BeautifulSoup简介与安装(一)
2018/06/17 Python
python实现搜索文本文件内容脚本
2018/06/22 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
2020/02/17 Python
selenium与xpath之获取指定位置的元素的实现
2021/01/26 Python
css3实现一款模仿iphone样式的注册表单
2013/03/20 HTML / CSS
英国综合网上购物商城:The Hut
2018/07/03 全球购物
工商管理专业实习生自我鉴定
2013/09/29 职场文书
酒店总经理助理岗位职责
2014/02/01 职场文书
卫生院健康教育实施方案
2014/06/07 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
统计工作个人总结
2015/03/03 职场文书
幼儿园2016圣诞节活动总结
2016/03/31 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书