客户端(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网络游戏-(模拟城市webgame)提供的一些例子下载
Oct 14 Javascript
JS编程小常识很有用
Nov 26 Javascript
js实现全屏漂浮广告移入光标停止移动
Dec 02 Javascript
chrome下img加载对height()的影响示例探讨
May 26 Javascript
网页实时显示服务器时间和javscript自运行时钟
Jun 09 Javascript
JavaScript数组去重的两种方法推荐
Apr 05 Javascript
用headjs来管理和加载js 提高网站加载速度
Nov 29 Javascript
jQuery Easyui 下拉树组件combotree
Dec 16 Javascript
node.js中express中间件body-parser的介绍与用法详解
May 23 Javascript
vue基于Element构建自定义树的示例代码
Sep 19 Javascript
在vue中利用v-html按分号将文本换行的例子
Nov 14 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
Sep 16 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新手上路(十三)
2006/10/09 PHP
在PHP中检查PHP文件是否有语法错误的方法
2009/12/23 PHP
php radio 单选框获取与保持值的实现代码
2010/05/15 PHP
php pki加密技术(openssl)详解
2013/07/01 PHP
javascript里的条件判断
2007/02/27 Javascript
JavaScript去掉数组中的重复元素
2011/01/13 Javascript
js换图片效果可进行定时操作
2014/06/09 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
JavaScript易错知识点整理
2016/12/05 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
JavaScript中动态向表格添加数据
2017/01/24 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
webpack打包多页面的方法
2018/11/30 Javascript
微信小程序自定义弹出模态框禁止底部滚动功能
2020/03/09 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
Python实现遍历目录的方法【测试可用】
2017/03/22 Python
使用python的pandas库读取csv文件保存至mysql数据库
2018/08/20 Python
使用Python自动生成HTML的方法示例
2019/08/06 Python
python程序中的线程操作 concurrent模块使用详解
2019/09/23 Python
pytorch实现特殊的Module--Sqeuential三种写法
2020/01/15 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
pycharm进入时每次都是insert模式的解决方式
2021/02/05 Python
彻底弄明白CSS3的Media Queries(跨平台设计)
2010/07/27 HTML / CSS
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
伯克斯奥特莱斯:Burkes Outlet
2019/03/30 全球购物
英国领先的独立时装店:Van Mildert
2019/10/28 全球购物
端口镜像是怎么实现的
2014/03/25 面试题
恶意软件的定义
2014/11/12 面试题
土木工程毕业生自荐信
2013/09/21 职场文书
电子专业推荐信范文
2013/11/18 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书
2014领导班子四风问题对照检查材料思想汇报
2014/09/21 职场文书
简单通用的简历自我评价
2014/09/21 职场文书