如何在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绑定事件不执行但alert后可以正常执行
Jun 03 Javascript
js实现图片从左往右渐变切换效果的方法
Feb 06 Javascript
关于获取DIV内部内容报错的原因分析及解决办法
Jan 29 Javascript
jQuery 3.0 的 setter和getter 模式详解
Jul 11 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
Aug 08 Javascript
原生JS查找元素的方法(推荐)
Nov 22 Javascript
html判断当前页面是否在iframe中的实例
Nov 30 Javascript
ionic实现下拉刷新载入数据功能
May 11 Javascript
微信小程序制作扭蛋机代码实例
Sep 24 Javascript
带你彻底理解JavaScript中的原型对象
Apr 14 Javascript
Vue 打包后相对路径的引用问题
Jun 05 Vue.js
TS 类型收窄教程示例详解
Sep 23 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
非常不错的MySQL优化的8条经验
2008/03/24 PHP
php visitFile()遍历指定文件夹函数
2010/08/21 PHP
php列出一个目录下的所有文件的代码
2012/10/09 PHP
smarty模板引擎使用内建函数foreach循环取出所有数组值的方法
2015/01/22 PHP
laravel框架模型、视图与控制器简单操作示例
2019/10/10 PHP
JavaScript 替换Html标签实现代码
2009/10/14 Javascript
jQuery chili图片远处放大插件
2009/11/30 Javascript
javaScript对文字按照拼音排序实现代码
2013/12/27 Javascript
兼容主流浏览器的iframe自适应高度js脚本
2014/01/10 Javascript
怎么判断js脚本加载完成
2014/02/28 Javascript
jQuery设置和移除文本框默认值的方法
2015/03/09 Javascript
javascript实现的图片切割多块效果实例
2015/05/07 Javascript
js判断浏览器类型及设备(移动页面开发)
2015/07/30 Javascript
谈谈JavaScript异步函数发展历程
2015/09/29 Javascript
浅述Javascript的外部对象
2016/12/07 Javascript
微信小程序开发之视频播放器 Video 弹幕 弹幕颜色自定义实例
2016/12/08 Javascript
Vue实现双向绑定的原理以及响应式数据的方法
2018/07/02 Javascript
微信小程序实现分享朋友圈的图片功能示例
2019/01/18 Javascript
javascript二维数组和对象的深拷贝与浅拷贝实例分析
2019/10/26 Javascript
TypeScript高级用法的知识点汇总
2019/12/17 Javascript
CKEditor扩展插件:自动排版功能autoformat插件实现方法详解
2020/02/06 Javascript
使用Python求解最大公约数的实现方法
2015/08/20 Python
Windows下Python2与Python3两个版本共存的方法详解
2017/02/12 Python
win10 64bit下python NLTK安装教程
2018/09/19 Python
详解python--模拟轮盘抽奖游戏
2019/04/12 Python
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
Python运行异常管理解决方案
2020/03/09 Python
Pytorch实验常用代码段汇总
2020/11/19 Python
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
幼师自我鉴定
2014/02/01 职场文书
推普周国旗下讲话稿
2014/09/21 职场文书
居委会个人对照检查材料思想汇报
2014/09/29 职场文书
关于倡议书的范文
2015/04/29 职场文书
教师节简报
2015/07/20 职场文书
mysql5.7的安装及Navicate长久免费使用的实现过程
2021/11/17 MySQL