客户端(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 相关文章推荐
找到了一篇jQuery与Prototype并存的冲突的解决方法
Aug 29 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
May 11 Javascript
JavaScript(JS) 压缩 / 混淆 / 格式化 批处理工具
Dec 10 Javascript
jquery实现点击消失的代码
Mar 03 Javascript
如何用JavaScript定义一个类
Sep 12 Javascript
JavaScript使用addEventListener添加事件监听用法实例
Jun 01 Javascript
JS检测是否可以访问公网服务器功能代码
Jun 19 Javascript
js实现数组内数据的上移和下移的实例
Nov 14 Javascript
vue2实现可复用的轮播图carousel组件详解
Nov 27 Javascript
从零开始最小实现react服务器渲染详解
Jan 26 Javascript
详解Vue Elementui中的Tag与页面其它元素相互交互的两三事
Sep 25 Javascript
微信小程序使用字体图标的方法
May 23 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
关于js与php互相传值的介绍
2013/06/25 PHP
php中数据库连接方式pdo和mysqli对比分析
2015/02/25 PHP
Extjs学习笔记之六 面版
2010/01/08 Javascript
高效率JavaScript编写技巧整理
2013/08/23 Javascript
js验证整数加保留小数点的简单实例
2013/12/02 Javascript
js操纵dom生成下拉列表框的方法
2014/02/24 Javascript
jquery提交form表单简单示例分享
2014/03/03 Javascript
JS调试必备的5个debug技巧
2014/03/07 Javascript
ExtJS4给Combobox设置列表中的默认值示例
2014/05/02 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
利用jQuery设计一个简单的web音乐播放器的实例分享
2016/03/08 Javascript
js获取页面及个元素高度、宽度的代码
2016/04/26 Javascript
jQuery on()方法绑定动态元素的点击事件实例代码浅析
2016/06/16 Javascript
JS动态给对象添加事件的简单方法
2016/07/19 Javascript
原生JS实现风箱式demo,并封装了一个运动框架(实例代码)
2016/07/22 Javascript
Vue.js双向绑定实现原理详解
2016/12/22 Javascript
js实现简单的获取验证码按钮效果
2017/03/03 Javascript
JS排序之快速排序详解
2017/04/08 Javascript
JS图片预加载插件详解
2017/06/21 Javascript
jQuery中图片展示插件highslide.js的简单dom
2018/04/22 jQuery
javascript和php使用ajax通信传递JSON的实例
2018/08/21 Javascript
vue项目打包部署到服务器的方法示例
2018/08/27 Javascript
原生JS实现贪吃蛇小游戏
2020/03/09 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
[01:33:14]LGD vs VP Supermajor 败者组决赛 BO3 第二场 6.10
2018/07/04 DOTA
python实现朴素贝叶斯分类器
2018/03/28 Python
详解配置Django的Celery异步之路踩坑
2018/11/25 Python
pandas实现将日期转换成timestamp
2019/12/07 Python
Python urllib request模块发送请求实现过程解析
2020/12/10 Python
移动端html5模拟长按事件的实现方法
2018/09/30 HTML / CSS
苹果美国官方商城:Apple美国
2016/08/24 全球购物
德国50岁以上交友网站:Lebensfreunde
2020/03/18 全球购物
电气技术员岗位职责
2013/11/19 职场文书
旅游个人求职信范文
2014/01/30 职场文书
带你彻底理解JavaScript中的原型对象
2021/04/14 Javascript
python 中[0]*2与0*2的区别说明
2021/05/10 Python