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 相关文章推荐
使用TextRange获取输入框中光标的位置的代码
Mar 08 Javascript
js实现回放拖拽轨迹从过程上进行分析
Jun 26 Javascript
深入理解JavaScript系列(41):设计模式之模板方法详解
Mar 04 Javascript
关注jquery技巧提高jquery技能(前端开发必学)
Nov 02 Javascript
通过V8源码看一个关于JS数组排序的诡异问题
Aug 14 Javascript
对于js垃圾回收机制的理解
Sep 14 Javascript
layer.open关闭父窗口 以及调用父页面的方法
Aug 17 Javascript
vue项目中使用tinymce编辑器的步骤详解
Sep 11 Javascript
详解ES6 Symbol 的用途
Oct 14 Javascript
你了解vue3.0响应式数据怎么实现吗
Jun 07 Javascript
vuex 动态注册方法 registerModule的实现
Jul 03 Javascript
详解阿里Node.js技术文档之process模块学习指南
Jan 04 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
overlord人气高涨,却被菲利普频繁举报,第四季很难在国内上映
2020/05/06 日漫
php include,include_once,require,require_once
2008/09/05 PHP
php实现专业获取网站SEO信息类实例
2015/04/02 PHP
PHP中常用的魔术方法
2017/04/28 PHP
浅谈php调用python文件
2019/03/29 PHP
Javascript 继承实现例子
2009/08/12 Javascript
Jjcarousellite 实现图片列表滚动的简单实例
2013/11/29 Javascript
Jquery 切换不同图片示例代码
2013/12/05 Javascript
jQuery插件Tooltipster实现漂亮的工具提示
2015/04/12 Javascript
js+css简单实现网页换肤效果
2015/12/29 Javascript
VUE axios发送跨域请求需要注意的问题
2017/07/06 Javascript
js求数组中全部数字可拼接出的最大整数示例代码
2017/08/25 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
VUE项目axios请求头更改Content-Type操作
2020/07/24 Javascript
简单介绍Python中的try和finally和with方法
2015/05/05 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
python实现决策树C4.5算法详解(在ID3基础上改进)
2017/05/31 Python
python实现批量修改文件名代码
2017/09/10 Python
TensorFlow实现模型评估
2018/09/07 Python
Python中文编码知识点
2019/02/18 Python
python框架flask表单实现详解
2019/11/04 Python
python输出pdf文档的实例
2020/02/13 Python
Keras 利用sklearn的ROC-AUC建立评价函数详解
2020/06/15 Python
Html5跳转到APP指定页面的实现
2020/01/14 HTML / CSS
总经理岗位职责描述
2014/02/08 职场文书
销售个人求职信范文
2014/04/28 职场文书
计划生育宣传标语
2014/06/21 职场文书
中职生求职信
2014/07/01 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
行政复议决定书
2015/06/24 职场文书
欠条格式范本
2015/07/03 职场文书
2016七一建党节慰问信
2015/11/30 职场文书
八年级作文之感恩
2019/11/22 职场文书
python四个坐标点对图片区域最小外接矩形进行裁剪
2021/06/04 Python
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang