Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装


Posted in Javascript onOctober 21, 2019

使用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的文件用来存放请求方法

Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装

配置请求代理

在config文件夹下面创建一个host.js文件用来存放开发、测试、生产的请求地址ip

Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装

在文件中你可以根据条件来配置到底是开发还是测试或者是正式环境

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 启动脚本文件的名称

Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装

在浏览器中打开服务的地址点击我们创建的按钮查看请求接口

Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装

可以看到我们的代理是请求成功的;状态之所以是304是因为第二次请求的时候如果请求没有发生改变就会使用浏览器缓存;

上面遗留了一个bug就是这个方法只适用于build后的项目;在开发中每次都build无疑浪费了很多时间,下面就来在开发环境中使用服务器代理的方式完成跨域请求

如果是cli创建的项目直接在config文件夹下面的index文件中的proxyTable进行添加就可以了

Vue使用vue-recoure + http-proxy-middleware + vuex配合promise实现基本的跨域请求封装

Javascript 相关文章推荐
用CSS+JS实现的进度条效果效果
Jun 05 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
Jul 09 Javascript
JQuery下拉框应用示例介绍
Apr 23 Javascript
jQuery中的编程范式详解
Dec 15 Javascript
js实现网页抽奖实例
Aug 05 Javascript
实例解析Array和String方法
Dec 14 Javascript
浅谈react 同构之样式直出
Nov 07 Javascript
用Cordova打包Vue项目的方法步骤
Feb 02 Javascript
node中使用log4js4.x版本记录日志的方法
Aug 20 Javascript
Vue 通过公共字段,拼接两个对象数组的实例
Nov 07 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
Jul 23 Javascript
vue移动端写的拖拽功能示例代码
Sep 09 Javascript
小程序实现日历左右滑动效果
Oct 21 #Javascript
微信小程序可滑动月日历组件使用详解
Oct 21 #Javascript
微信小程序可滑动周日历组件使用详解
Oct 21 #Javascript
小程序实现横向滑动日历效果
Oct 21 #Javascript
微信小程序实现点击图片放大预览
Oct 21 #Javascript
vue实现Input输入框模糊查询方法
Jan 29 #Javascript
mpvue实现左侧导航与右侧内容的联动
Oct 21 #Javascript
You might like
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
PHP高自定义性安全验证码代码
2011/11/27 PHP
codeigniter教程之多文件上传使用示例
2014/02/11 PHP
PHP清除数组中所有字符串两端空格的方法
2014/10/20 PHP
php文件上传的两种实现方法
2016/04/04 PHP
js加载之使用DOM方法动态加载Javascript文件
2013/11/08 Javascript
jquery简单插件制作(fn.extend)完整实例
2016/05/24 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
通过JS运行机制的角度说说作用域
2019/03/12 Javascript
ES6中异步对象Promise用法详解
2019/07/31 Javascript
vux-scroller实现移动端上拉加载功能过程解析
2019/10/08 Javascript
在Layui中操作数据表格,给指定单元格添加事件示例
2019/10/26 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
js 解析 JSON 数据简单示例
2020/04/21 Javascript
vue 路由懒加载中给 Webpack Chunks 命名的方法
2020/04/24 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
Vue中关闭弹窗组件时销毁并隐藏操作
2020/09/01 Javascript
[01:38]女王驾到——至宝魔廷新尊技能&特效展示
2020/06/16 DOTA
Python 中 list 的各项操作技巧
2017/04/13 Python
EM算法的python实现的方法步骤
2018/01/02 Python
pandas 将list切分后存入DataFrame中的实例
2018/07/03 Python
python在html中插入简单的代码并加上时间戳的方法
2018/10/16 Python
python 命令行传入参数实现解析
2019/08/30 Python
利用纯CSS3实现文字向右循环闪过效果实例(可用于移动端)
2017/06/15 HTML / CSS
南京某公司笔试题
2013/01/27 面试题
技术人员面试提纲
2013/11/28 职场文书
九年级体育教学反思
2014/01/23 职场文书
建筑个人求职信范文
2014/01/25 职场文书
火车的故事教学反思
2014/02/11 职场文书
手机被没收检讨书
2014/02/22 职场文书
小学生读书活动总结
2014/06/30 职场文书
公司法定代表人授权委托书
2014/09/29 职场文书
初婚初育证明范本
2015/06/18 职场文书
重阳节主题班会
2015/08/17 职场文书
Go语言中break label与goto label的区别
2021/04/28 Golang
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
2022/01/22 MySQL