客户端(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 相关文章推荐
Convert Seconds To Hours
Jun 16 Javascript
jquery pagination插件实现无刷新分页代码
Oct 13 Javascript
30个精美的jQuery幻灯片效果插件和教程
Aug 23 Javascript
使用script的src实现跨域和类似ajax效果
Nov 10 Javascript
jQuery动态效果显示人物结构关系图的方法
May 07 Javascript
JS实现左右无缝轮播图代码
May 01 Javascript
详解JavaScript中的六种错误类型
Sep 21 Javascript
vue删除html内容的标签样式实例
Sep 13 Javascript
vue+echarts实现可拖动节点的折线图(支持拖动方向和上下限的设置)
Apr 12 Javascript
js实现一款简单踩白块小游戏(曾经很火)
Dec 02 Javascript
Vue Element校验validate的实例
Sep 21 Javascript
React实现动效弹窗组件
Jun 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
Zend Studio 无法启动的问题解决方法
2008/12/04 PHP
php中OR与|| AND与&&的区别总结
2013/10/26 PHP
php中ftp_chdir与ftp_cdup函数用法
2014/11/18 PHP
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
javascript九宫格图片随机打乱位置的实现方法
2017/03/15 Javascript
Vue通过URL传参如何控制全局console.log的开关详解
2017/12/07 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
Vue隐藏显示、只读实例代码
2018/07/18 Javascript
基于javascript实现碰撞检测
2020/03/12 Javascript
vue3.0 的 Composition API 的使用示例
2020/10/26 Javascript
Python实现朴素贝叶斯分类器的方法详解
2018/07/04 Python
浅析python中的迭代与迭代对象
2018/10/08 Python
Pycharm及python安装详细步骤及PyCharm配置整理(推荐)
2020/07/31 Python
Django之全局使用request.user.username的实例详解
2020/05/14 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
Python之多进程与多线程的使用
2021/02/23 Python
浅析几个CSS3常用功能的写法
2014/06/05 HTML / CSS
Meli Melo官网:名媛们钟爱的英国奢侈手包品牌
2017/04/17 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
德国W家官网,可直邮中国的母婴商城:Windeln.de
2021/03/03 全球购物
保荐人的岗位职责
2013/11/19 职场文书
暑期实习鉴定
2013/12/16 职场文书
园林技术个人的自我评价
2014/01/08 职场文书
财务学生的职业生涯发展
2014/02/11 职场文书
超市优秀员工获奖感言
2014/08/15 职场文书
暑假社会实践心得体会
2014/09/02 职场文书
企业党员岗位承诺书
2015/04/27 职场文书
2015年学校办公室主任工作总结
2015/07/20 职场文书
大学学习委员竞选稿
2015/11/20 职场文书
2016年大学生实习单位评语
2015/12/01 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
2019年销售部季度工作计划3篇
2019/10/09 职场文书
Nginx下配置Https证书详细过程
2021/04/01 Servers
Python turtle实现贪吃蛇游戏
2021/06/18 Python