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静态的动态
Sep 18 Javascript
默认让页面的第一个控件选中的javascript代码
Dec 26 Javascript
JavaScript实现两个Table固定表头根据页面大小自行调整
Jan 03 Javascript
js由下向上不断上升冒气泡效果实例
May 07 Javascript
用canvas 实现个图片三角化(LOW POLY)效果
Feb 18 Javascript
javascript移动开发中touch触摸事件详解
Mar 18 Javascript
node+experss实现爬取电影天堂爬虫
Nov 20 Javascript
浅谈jQuery this和$(this)的区别及获取$(this)子元素对象的方法
Nov 29 Javascript
纯js三维数组实现三级联动效果
Feb 07 Javascript
JS正则表达式验证账号、手机号、电话和邮箱是否合法
Mar 08 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
Dec 24 Javascript
jQuery插件simplePagination的使用方法示例
Apr 28 jQuery
小程序实现日历左右滑动效果
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
使用 eAccelerator加速PHP代码的目的
2007/03/16 PHP
ThinkPHP查询中的魔术方法简述
2014/06/25 PHP
VPS中使用LNMP安装WordPress教程
2014/12/28 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
php利用事务处理转账问题
2015/04/22 PHP
PHP缓冲区用法总结
2016/02/14 PHP
PHP 实现从数据库导出到.csv文件方法
2017/07/06 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
ExtJs GridPanel简单的增删改实现代码
2010/08/26 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
2014/10/20 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
jquery超简单实现手风琴效果的方法
2015/06/05 Javascript
JS实现转动随机数抽奖特效代码
2020/04/16 Javascript
javascript实现计时器的简单方法
2016/02/21 Javascript
js剪切板应用clipboardData实例解析
2016/05/29 Javascript
javascript基础练习之翻转字符串与回文
2017/02/20 Javascript
详解Vue.js和layui日期控件冲突问题解决办法
2019/07/25 Javascript
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
使用Python的Treq on Twisted来进行HTTP压力测试
2015/04/16 Python
python调用java模块SmartXLS和jpype修改excel文件的方法
2015/04/28 Python
Python 实现简单的shell sed替换功能(实例讲解)
2017/09/29 Python
python使用numpy读取、保存txt数据的实例
2018/10/14 Python
详解python配置虚拟环境
2019/04/08 Python
python爬虫 execjs安装配置及使用
2019/07/30 Python
Python3标准库之dbm UNIX键-值数据库问题
2020/03/24 Python
TensorFlow固化模型的实现操作
2020/05/26 Python
浅谈HTML5 服务器推送事件(Server-sent Events)
2017/08/01 HTML / CSS
冰淇淋店创业计划书范文
2013/12/27 职场文书
交通事故协议书范文
2014/04/16 职场文书
党的群众路线教育实践活动个人承诺书
2014/05/22 职场文书
2014年学雷锋活动总结
2014/06/26 职场文书
个人思想政治总结
2015/03/05 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
企业内部管理控制:银行存款控制制度范本
2020/01/10 职场文书