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 相关文章推荐
javascript之通用简单的table选项卡实现(二)
May 09 Javascript
Javascript中的关键字和保留字整理
Oct 16 Javascript
js纯数字逐一停止显示效果的实现代码
Mar 16 Javascript
微信小程序 倒计时组件实现代码
Oct 24 Javascript
微信小程序 Tab页切换更新数据
Jan 05 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
Jan 06 Javascript
bootstrap折叠调用collapse()后data-parent不生效的快速解决办法
Feb 23 Javascript
JavaScript代码实现txt文件的上传预览功能
Mar 27 Javascript
layui-laydate时间日历控件使用方法详解
Nov 15 Javascript
layer弹出层倒计时关闭的实现方法
Sep 27 Javascript
教你使用vscode 搭建react-native开发环境
Jul 07 Javascript
Js类的构建与继承案例详解
Sep 15 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
解析php通过cookies获取远程网页的指定代码
2013/06/25 PHP
php字符串替换函数substr_replace()用法实例
2015/03/17 PHP
PHP中单例模式与工厂模式详解
2017/02/17 PHP
PHP删除数组中特定元素的两种方法
2019/02/28 PHP
让IE8支持DOM 2(不用框架!)
2009/12/31 Javascript
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
jQuery下实现等待指定元素加载完毕(可改成纯js版)
2013/07/11 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
Three.js利用顶点绘制立方体的方法详解
2017/09/27 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
搭建element-ui的Vue前端工程操作实例
2018/02/23 Javascript
VUE+Element UI实现简单的表格行内编辑效果的示例的代码
2018/10/31 Javascript
微信小程序图片加载失败时替换为默认图片的方法
2019/12/09 Javascript
小程序按钮避免多次调用接口和点击方案实现(不用showLoading)
2020/04/15 Javascript
win系统下为Python3.5安装flask-mongoengine 库
2016/12/20 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
django 自定义过滤器的实现
2019/02/26 Python
python循环定时中断执行某一段程序的实例
2019/06/29 Python
python中的数组赋值与拷贝的区别详解
2019/11/26 Python
使用tensorflow DataSet实现高效加载变长文本输入
2020/01/20 Python
解决jupyter notebook显示不全出现框框或者乱码问题
2020/04/09 Python
Python项目实战之使用Django框架实现支付宝付款功能
2021/02/23 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
垃圾回收的优点和原理。并考虑2种回收机制
2016/10/16 面试题
市场营销专科应届生求职信
2013/11/24 职场文书
茶叶生产计划书
2014/01/10 职场文书
十八大闭幕感言
2014/01/22 职场文书
《赵州桥》教学反思
2014/02/17 职场文书
消防安全责任书
2014/04/14 职场文书
公司优秀员工获奖感言
2014/08/14 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
大学生国家助学金感谢信
2015/01/23 职场文书
检讨书范文2000字
2015/01/28 职场文书
情况说明书怎么写
2015/10/08 职场文书
解决MySQL Varchar 类型尾部空格的问题
2022/04/06 MySQL