客户端(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 相关文章推荐
JavaScript接口实现代码 (Interfaces In JavaScript)
Jun 11 Javascript
JS读取cookies信息(记录用户名)
Jan 10 Javascript
javascript:文字不间断向左移动的实例代码
Aug 08 Javascript
跟我学习javascript的函数调用和构造函数调用
Nov 16 Javascript
Javascript使用SWFUpload进行多文件上传
Nov 16 Javascript
基于javascript实现按圆形排列DIV元素(一)
Dec 02 Javascript
js实现九宫格拼图小游戏
Feb 13 Javascript
webpack 打包压缩js和css的方法示例
Mar 20 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
Sep 05 Javascript
VUE实现图片验证码功能
Nov 18 Javascript
解决vue-cli@3.xx安装不成功的问题及搭建ts-vue项目
Feb 09 Javascript
jQuery弹框插件使用方法详解
May 26 jQuery
微信小程序实现顶部普通选项卡效果(非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包含文件函数include、include_once、require、require_once区别总结
2014/04/05 PHP
PHP PDOStatement对象bindpram()、bindvalue()和bindcolumn之间的区别
2014/11/20 PHP
Smarty保留变量用法分析
2016/05/23 PHP
微信小程序 消息推送php服务器验证实例详解
2017/03/30 PHP
基于jQuery的左右滚动实现代码
2010/12/03 Javascript
jQuery.extend 函数的详细用法
2012/06/27 Javascript
经过绑定元素时会多次触发mouseover和mouseout事件
2014/02/28 Javascript
一个不错的字符串转码解码函数(自写)
2014/07/31 Javascript
jQuery实现div拖拽效果实例分析
2016/02/20 Javascript
javascript 中设置window.location.href跳转无效问题解决办法
2017/02/09 Javascript
Vue.js实现可排序的表格组件功能示例
2019/02/19 Javascript
Layui Table js 模拟选中checkbox的例子
2019/09/03 Javascript
uniapp实现横向滚动选择日期
2020/10/21 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
基于vue实现微博三方登录流程解析
2020/11/04 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python实现提取谷歌音乐搜索结果的方法
2015/07/10 Python
Python解惑之True和False详解
2017/04/24 Python
Python环境搭建之OpenCV的步骤方法
2017/10/20 Python
浅谈Python黑帽子取代netcat
2018/02/10 Python
Python Opencv提取图片中某种颜色组成的图形的方法
2019/09/19 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
如何在python中实现线性回归
2020/08/10 Python
HTML5 离线应用之打造零请求、无流量网站的解决方法
2013/04/25 HTML / CSS
HTML5页面无缝闪开的问题及解决方案
2020/06/11 HTML / CSS
压铸汽车模型收藏家:Diecastmodelswholesale.com
2016/12/21 全球购物
草莓巧克力:Shari’s Berries
2017/02/07 全球购物
大众服装店创业计划书范文
2014/01/01 职场文书
2014领导班子正风肃纪思想汇报
2014/09/18 职场文书
银行委托书范本
2014/09/28 职场文书
企业投资意向书
2015/05/09 职场文书
社区党建工作总结2015
2015/05/13 职场文书
图解上海144收音机
2021/04/22 无线电
Vue中插槽slot的使用方法与应用场景详析
2021/06/08 Vue.js