Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装
- 使用
vue init webpack 你的项目名称初始化一个vue的项目 - 安装依赖
npm install vue-resource http-proxy-middleware vuex koa - 在项目的main.js中引入并注册下载的依赖
- 在main.js中引入
vue-resource并注册到vue实例中
import VueResource from 'vue-resource' //用来请求接口
Vue.use(VueResource)
//开启后请求就会以application/x-www-form-urlencoded作为MIME type 就像普通的html表单一样,form形式传给后台,而非JSON
Vue.http.options.emulateJSON = true;
- 在main.js文件同级创建一个store的文件夹用来存放vuex的文件
- 在store文件夹中创建一个index.js的文件(vue在查找时会自动查找这个文件),在文件中创建store实例并导出
import Vue from 'vue'
import VueX from 'vuex'
import actions from './actions' //这里为了可扩展性,所以单独创建一个文件用来存放请求方法 Vue.use(VueX);
//请求之甬道actions所以只导入了actions
export default new VueX.Store({
actions
});
- 在store文件夹中创建一个actions.js的文件用来存放请求方法
)

- 配置请求代理
- 在config文件夹下面创建一个
host.js文件用来存放开发、测试、生产的请求地址ip
- 在文件中你可以根据条件来配置到底是开发还是测试或者是正式环境
let HostType = 0; //用来判断当前是什么环境
let Host = {}; //用来存储当前环境的请求ip
if (HostType == 0) {
Host = { //对象内的字段可以自定义如果整个项目只有一个后台地址只需要一个字段就可以;
api: "127.0.0.1:9000",
base: "",
fileUp: ""
}
} else if (HostType == 1) {
Host = {
...
}
} else if (HostType == 2) {
Host = {
...
}
}
module.exports = Host;- 在config文件夹下面创建一个
proxy-table.js文件用来存放代理的配置const HOST = require("./HOST.js"); module.exports = {
//接口代理
"/api/text": {
target: HOST.api, //需要代理到那个地址
changeOrigin: true //是否跨域
},
"/api/demo": {
target: HOST.api,
changeOrigin: true
}
} - 在config文件夹下面创建一个
proxy-middleware.js凭借代理和注册//导入插件
const proxyMiddleware = require("http-proxy-middleware");
//导入代理的配置
const proxyTable = require("./proxy-table");
//拿出配置代理的所有匹配的字段
const proxyContext = Object.keys(proxyTable); // ["/api/text","/api/demo"] module.exports = () => {
//创建一个默认的配置对象
const defautOptions = {
changeOrigin: true,
secure: false
}
//为什么return的是一个async的方法是因为请求代理是通过服务器进行代理的在启动脚本中会使用koa框架来注册这个中间件
return async (ctx, next) => { //ctx和next都是koa框架中间件自带的参数
for (let context of proxyContext) { //循环我们拿到的keys数组
if (ctx.url.startsWith(context)) { //判断当前请求的url中是不是以拿到的keys数组中的某个值开头的
ctx.respond = false; //绕开koa框架的内置response处理
let options = proxyTable[context];
//如果拿取到的直接是IP地址就赋值给配置对象
if (typeof options === 'string') {
options = {
target: options
}
}
//使用Object.assign()方法合并两个对象
options = Object.assign({},defautOptions,options);
//将每一个代理都注册,这里必须return一个自执行函数否则代理不会设置成功
proxyMiddleware(context,options)(ctx.req,ctx.res, next);
}
}
await next();
}
} - 在项目的更目录中创建一个服务启动的文件脚本名字自定义
//在脚本文件中导入我们需要的框架和代理配置文件
const Koa = require("koa"); //所用的框架
const proxy = require("./config/proxy-middleware"); //刚才创建的代理配置文件
//创建一个服务
const app = new Koa(); //将代理插件注册到服务上
app.use(proxy()); //因为我们导出的是一个方法所以需要使用调用的方式注册 //启动服务
app.listen(9000,() => {
console.log("server running at http://127.0.0.1:9000");
}); //对koa框架不是熟悉的可以使用express框架 如果使用express框架拿代理就不用使用前面那样复杂的写法了
const express = require("express");
const proxy = require("http-proxy-middleware"); const app = express(); app.use(express.static("dist/"));
app.use("/all", proxy({
target: "http://127.0.0.1:3000",
changeOrigin: true,
})) app.listen(9000, (err) => {
if (err) return console.log(err);
console.log("app as running at http://127.0.0.1:9000");
})- 代理配置好以后就可以写请求方法了,在创建好的store文件夹下面的actions文件里编写请方法
//导入Vue
import Vue from "vue"
export default {
//测试接口
testInterface({},postdata) {
//postdata是你调用的时候传过来的参数可以更具需求拼接接口
//let ipstr = `/api/text?id=${postdata.id}`;
//return Vue.http.get(ipstr,{}).then(response => {
return Vue.http.get("/api/text",{}).then(response => {
if (response.status == 200) {
return new Promise(response.body);
} else {
return new Promise(response.data.message);
}
})
}
}- 测试代理是否成功
<div id="app">
<button @click="clickF">按钮</button>
</div>- 首先在script标签里面将vuex导入进来
- import {mapActions} from "vuex";
- 在methods中创建一个方法用来发送请求,并在methods的最下面使用结构函数将我们存在vuex中的请求方法按需导入
methods: {
clickF() {
this.testInterface().then(data=> {
console.log(data);
})
},
...mapActions(["testInterface"])
}- 直接使用this.方法名就可以访问到vuex中的actions方法;这里使用的是辅助函数,也可以使用原始方法
- 在终端中使用
node 启动脚本文件的名称或者使用nodemon 启动脚本文件的名称 
- 在浏览器中打开服务的地址点击我们创建的按钮查看请求接口

- 可以看到我们的代理是请求成功的;状态之所以是304是因为第二次请求的时候如果请求没有发生改变就会使用浏览器缓存;
- 上面遗留了一个bug就是这个方法只适用于build后的项目;在开发中每次都build无疑浪费了很多时间,下面就来在开发环境中使用服务器代理的方式完成跨域请求
- 如果是cli创建的项目直接在config文件夹下面的index文件中的proxyTable进行添加就可以了

- 在config文件夹下面创建一个
Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装的更多相关文章
- Spring Boot + Vue 跨域请求问题
使用Spring Boot + Vue 做前后端分离项目搭建,实现登录时,出现跨域请求 Access to XMLHttpRequest at 'http://localhost/open/login ...
- vue实现跨域请求的设置
vue实现跨域请求,需要在vue.config.js里添加以下设置 proxy: { '/service/rest': { target: 'http://localhost:8080/autotab ...
- 本地Vue项目跨域请求本地Node.js服务器的配置方法
前言:跨域请求是在本地开发时经常遇到的需求,也很简单,只是几句代码配置一下的问题.我初次配置跨域请求时由于官方的说明太简洁,找到的教程又落伍,调试了一番并没有解决问题,到最后解决问题,已花费了很多时间 ...
- vue 使用axios 跨域请求数据的问题
axios默认是没有jsonp 跨域请求的方法的.一般来说流行的做法是将跨域放在后台来解决,也就是后台开发人员添加跨域头信息. 例如java中的 header,response.setHeader(& ...
- $Django 前后端之 跨域问题(同源策略) vue项目(axios跨域请求数据)
1 跨域问题(多个域之间的数据访问) #同源策略(ip port 协议全部相同) #本站的只能请求本站域名的数据 #CORS实现(跨域资源共享) #实现CORS通信的关键是服务器.只要服务器实现了CO ...
- VUE系列三:实现跨域请求(fetch/axios/proxytable)
1. 在 config/index.js 配置文件中配置proxyTable 'use strict' // Template version: 1.3.1 // see http://vuejs-t ...
- vue.js学习之 跨域请求代理与axios传参
vue.js学习之 跨域请求代理与axios传参 一:跨域请求代理 1:打开config/index.js module.exports{ dev: { } } 在这里面找到proxyTable{}, ...
- Vue ajax跨域请求
Vue webpack-dev-server实现跨域请求 思路 配置webpack-dev-server,代理某一个路径到目标路径,同是更改源和重写 Vue里定义一个全部变量:site Vue.pro ...
- Vue三步完成跨域请求
三步完成跨域请求 ①main.js中: Vue.prototype.HOME = '/api'; ② config/index.js中: module.exports = { dev: { // Pa ...
随机推荐
- Ganglia环境搭建并监控Hadoop分布式集群
简介 Ganglia可以监控分布式集群中硬件资源的使用情况,例如CPU,内存,网络等资源.通过Ganglia可以监控Hadoop集群在运行过程中对集群资源的调度,作为简单地运维参考. 环境搭建流程 1 ...
- 作为IT面试官,我如何考核计算机专业毕业生?作为培训班老师,我又如何提升他们?
我最近几年一直在做技术面试官,除了面试有一定工作经验的社会人员外,有时还会面试在校实习生和刚毕业的大学生.同时,我也在学校里做过兼职讲师,上些政府补贴课程(这些课程有补贴,学生不用出钱),所以我会在不 ...
- 解决ie6上碰到的css兼容问题
ie6上css碰到的坑 前两天在给一个项目做东西的时候,碰到一个有意思的项目,是需要兼容ie6,有一些碰到并且解决的问题,给大家写下来,方便大家以后碰到类似的问题哈- 喜欢的话还请点赞! 1.impo ...
- 校园网打开IEEE 显示未登录
校园网访问IEEE 显示未登录,如图 解决办法 1.打开网络和共享中心 2.如图 3.把ipv6的钩去掉 4.把host文件(在C:\Windows\System32\drivers\etc)复制到桌 ...
- Beescms_v4.0 sql注入漏洞分析
Beescms_v4.0 sql注入漏洞分析 一.漏洞描述 Beescms v4.0由于后台登录验证码设计缺陷以及代码防护缺陷导致存在bypass全局防护的SQL注入. 二.漏洞环境搭建 1.官方下载 ...
- VS Code中无法识别npm命令
今天在VS Code中执行npm install命令时报了“'npm' 不是内部或外部命令,也不是可运行的程序或批处理文件”的错误. 首先检查环境变量是否配置正常: 系统变量中NODE_PATH,变量 ...
- 解决行内块元素(inline-block)之间的空格或空白问题
一.问题产生 由于html代码格式化后,标签会缩进或者换行.由于浏览器默认处理导致元素在页面显示中出现单个空格问题,尤其在行内或者行内块元素布局时影响比较明显 例如: 代码 页面显示 二.解决方案 这 ...
- 正睿OI国庆day1
正睿OI国庆day1 T1 \[ S_n=1*S_{n-1}+1*F_{n-1}+1*F_{n-2}+1*f_{n-1}+1*f_{n-2} \] \[ F_{n}=0*S_{n-1}+1*F_{n- ...
- PLSQL常用设置-提高开发效率
1.登录后默认自动选中My Objects 默认情况下,PLSQL Developer登录后,Brower里会选择All objects,如果你登录的用户是dba,要展开tables目录,正常情况都需 ...
- Ansible常用模块基本操作
Ansible是一个系列文章,我会尽量以通俗易懂.诙谐幽默的总结方式给大家呈现这些枯燥的知识点,让学习变的有趣一些. 前言 对于任何一个框架,一个应用,为了更便于推广,便于使用,便于商业化,都会顺便提 ...