客户端(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 相关文章推荐
jValidate 基于jQuery的表单验证插件
Dec 12 Javascript
javascript attachEvent绑定多个事件执行顺序问题
Oct 20 Javascript
JavaScript中的noscript元素属性位置及作用介绍
Apr 11 Javascript
javascript中的document.open()方法使用介绍
Oct 09 Javascript
jQuery之DOM对象和jQuery对象的转换与区别分析
Jan 08 Javascript
js实现从数组里随机获取元素
Jan 12 Javascript
轻量级网页遮罩层jQuery插件用法实例
Jul 31 Javascript
javascript实现状态栏中文字动态显示的方法
Oct 20 Javascript
jQuery实现的简单百分比进度条效果示例
Aug 01 Javascript
微信小程序基于canvas渐变实现的彩虹效果示例
May 03 Javascript
layui 对弹窗 form表单赋值的实现方法
Sep 04 Javascript
解决echarts vue数据更新,视图不更新问题(echarts嵌在vue弹框中)
Jul 20 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下实现农历日历的代码
2007/03/07 PHP
无法在发生错误时创建会话,请检查 PHP 或网站服务器日志,并正确配置 PHP 安装(win+linux)
2012/05/05 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP实现数据分页显示的简单实例
2016/05/26 PHP
php强制下载文件函数
2016/08/24 PHP
PHP简单留言本功能实现代码
2017/06/09 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
使用PHPUnit进行单元测试并生成代码覆盖率报告的方法
2019/03/08 PHP
微信公众平台开发教程⑤ 微信扫码支付模式介绍
2019/04/10 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
JS自定义功能函数实现动态添加网址参数修改网址参数值
2013/08/02 Javascript
jquery进行数组遍历如何跳出当前的each循环
2014/06/05 Javascript
nodejs教程之异步I/O
2014/11/21 NodeJs
jQuery实现仿Alipay支付宝首页全屏焦点图切换特效
2015/05/04 Javascript
JavaScript操作class和style样式代码详解
2016/02/13 Javascript
深入理解jquery中extend的实现
2016/12/22 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
2017/09/04 Javascript
Echarts之悬浮框中的数据排序问题
2018/11/08 Javascript
原生JS与CSS实现软件卸载对话框功能
2019/12/05 Javascript
在Python的web框架中配置app的教程
2015/04/30 Python
Python的Django中将文件上传至七牛云存储的代码分享
2016/06/03 Python
django项目运行因中文而乱码报错的几种情况解决
2017/11/07 Python
pandas中去除指定字符的实例
2018/05/18 Python
Python 新建文件夹与复制文件夹内所有内容的方法
2018/10/27 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
Python时间序列处理之ARIMA模型的使用讲解
2019/04/02 Python
python实现ftp文件传输功能
2020/03/20 Python
html5 Canvas画图教程(11)—使用lineTo/arc/bezierCurveTo画椭圆形
2013/01/09 HTML / CSS
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
Superdry极度乾燥官网:日本街头风格,纯英国制造品牌
2016/10/31 全球购物
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
中国首家奢侈品O2O网购平台:第五大道奢侈品网
2017/12/14 全球购物
static函数与普通函数有什么区别
2015/12/25 面试题
户外活动策划方案
2014/03/12 职场文书
信用社主任竞聘演讲稿
2014/05/23 职场文书
中秋节国旗下演讲稿
2014/09/13 职场文书