客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解


Posted in Javascript onAugust 26, 2017

本篇博客主要说明:

前后端框架(本例中是vue和koa)如何发送请求?获取响应?

以及跨域问题如何解决?

客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解

vue部分:

import App from './App.vue'
import Axios from 'axios'
new Vue({
  el: '#app',
  render: h => h(App),
  mounted(){
    Axios({
      method: 'get',
      url: 'http://localhost:3000',
    }).then((response) => {
    console.log(response);
    })
  }
})

koa部分:

const Koa = require('koa');
const cors = require('koa-cors');
const app = new Koa();
const main = ctx => {
  ctx.response.body = 'Hello World';
};
app.use(cors());
app.use(main);
app.listen(3000);
console.log("服务已启动");

坑集锦:

1.单纯引入koa框架并且开启服务,会出现跨域错误

XMLHttpRequest cannot load http://localhost:3000/. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080';; is therefore not allowed access.
bundle.js:1200 Uncaught (in promise) Error: Network Error
  at createError (bundle.js:1200)
  at XMLHttpRequest.handleError (bundle.js:1046)

2.跨域方案尝试

①引入cors模块(失败,TypeError: res.setHeader is not a function)

const cors = require('cors');
app.use(cors());

②引入koa-cors模块(成功,解决跨域问题,并正确返回数据)

const cors = require('koa-cors');
app.use(cors())

此时会在新的http response的头部信息中会新增2个字段。

Access-Control-Allow-Methods:GET,HEAD,PUT,POST,DELETEAccess-Control-Allow-Origin:http://localhost:8080

客户端(vue框架)与服务器(koa框架)通信及服务器跨域配置详解

现在我们来宏观分析一下,跨域失败以及成功的深层次原因是什么?

客户端(http://localhost:8080)

服务端:(http://localhost:3000)

跨域请求失败是谁的原因?
服务器的原因。

为什么这么说?

因为在服务器端引入koa-cors之前,注意,是服务器端,我们的跨域访问失败。

而在服务器引入跨域请求模块koa-cors之后,而客户端没有做任何改变,跨域访问就成功了。

具体来说,就是在返回的请求头里加入了2个跨域请求的字段,上文也给出了详细的HTTP定义。

一个代表支持的请求方法,本例中是get方法。

一个代表允许使用上述方法的域,本例中是http://localhost:8080。

1.那么聪明的你就会问了,koa-cors本质上是一个node模块,这个模块是怎么做到支持跨域访问到呢?

我想koa-cors肯定调用了node模块http,其余模块暂时未知。

2.那么聪明的你又会想到,axios呢,它的内部工作原理是什么?

我想肯定用到了的XMLHttpRequest这个对象,基于XMR对象做了封装,暂且知道这么多。

3.所以说聪明的你会有一个领悟!

node模块不止是能在服务器端调用,在客户端也可以调用。

说清楚一点,就是node模块不止能够封装node.js引擎的api,而且能封装web V8引擎的api。

若是想问原因的话,我想是因为node是基于V8y引擎开发的服务器环境,因此v8 api基本上是通用的,暂时这么理解。

所以说,前端开发模块化编程趋势下,nodejs必须要会,因为二者都是在强大的V8引擎驱动下工作的。

最后说个微观的坑...

下面的代码中,app.use(cors());必须在app.use(main);之前。

const Koa = require('koa');
const cors = require('koa-cors');
const app = new Koa();
const main = ctx => {
  ctx.response.body = 'Hello World';
};
app.use(cors());
app.use(main);
app.listen(3000);
console.log("服务已启动");

题外话:

和学长吃中饭的过程中,讨论到webkit,gecko和v8.以及手机浏览器和桌面浏览器的区别。

主要总结出几点:

1.v8是webkit的js引擎,Gecko有自己的js引擎。

2.PC端和移动端,统一理解成webkit端就行。

因为safari和chrome都是webkit内核,可以类比safari为苹果手机,chrome类比为android手机。

由此推理出安卓手机和苹果手机自带浏览器都是webkit内核。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js中将具有数字属性名的对象转换为数组
Mar 06 Javascript
JS声明变量背后的编译原理剖析
Dec 28 Javascript
利用浏览器全屏api实现js全屏
Jan 16 Javascript
js获取ajax返回值代码
Apr 30 Javascript
jQuery实现的鼠标滑过弹出放大图片特效
Jan 08 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
微信公众号开发 自定义菜单跳转页面并获取用户信息实例详解
Dec 08 Javascript
深入理解Node module模块
Mar 26 Javascript
老生常谈JavaScript获取CSS样式的方法(兼容各浏览器)
Sep 19 Javascript
vue 获取视频时长的实例代码
Aug 20 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
Nov 01 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
Sep 21 Javascript
微信小程序实现顶部普通选项卡效果(非swiper)
Jun 19 #Javascript
微信小程序实现顶部选项卡(swiper)
Jun 19 #Javascript
js实现本地时间同步功能
Aug 26 #Javascript
基于jQuery实现图片推拉门动画效果的两种方法
Aug 26 #jQuery
Javascript快速实现浏览器系统通知
Aug 26 #Javascript
深入浅出es6模板字符串
Aug 26 #Javascript
vue与bootstrap实现时间选择器的示例代码
Aug 26 #Javascript
You might like
PHP开源开发框架ZendFramework使用中常见问题说明及解决方案
2014/06/12 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
让广告代码不再影响你的网页加载速度
2006/07/07 Javascript
javascript编程起步(第五课)
2007/01/10 Javascript
JavaScript ( (__ = !$ + $)[+$] + ({} + $)[_/_] +({} + $)[_/_] )
2011/02/25 Javascript
jQuery :nth-child前有无空格的区别分析
2011/07/11 Javascript
使用js+jquery实现无限极联动
2013/05/23 Javascript
jQuery中click事件的定义和用法
2014/12/20 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
关于iframe跨域POST提交的方法示例
2017/01/15 Javascript
原生JS实现垂直手风琴效果
2017/02/19 Javascript
ReactNative实现Toast的示例
2017/12/31 Javascript
微信小程序之批量上传并压缩图片的实例代码
2018/07/05 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
如何实现echarts markline标签名显示自己想要的
2020/07/20 Javascript
Element Collapse 折叠面板的使用方法
2020/07/26 Javascript
Python下的Mysql模块MySQLdb安装详解
2014/04/09 Python
21行Python代码实现拼写检查器
2016/01/25 Python
python实现数据预处理之填充缺失值的示例
2017/12/22 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
python3使用QQ邮箱发送邮件
2020/05/20 Python
Opencv实现抠图背景图替换功能
2019/05/21 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
python GUI库图形界面开发之PyQt5控件数据拖曳Drag与Drop详细使用方法与实例
2020/02/27 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
Python生成pdf目录书签的实例方法
2020/10/29 Python
Prototype如何更新局部页面
2013/03/03 面试题
介绍一下Ruby的特点
2013/01/20 面试题
财务人员个人求职信范文
2013/12/04 职场文书
教师竞聘演讲稿
2014/05/16 职场文书
投标承诺书怎么写
2014/05/24 职场文书
诚实守信演讲稿
2014/09/01 职场文书
买房子个人收入证明
2014/10/12 职场文书