浅谈vue websocket nodeJS 进行实时通信踩到的坑


Posted in NodeJs onSeptember 22, 2020

先说明,我并不知道出现坑的原因是什么。我只是按照别人的写法就连上了。

我的处境是这样的

我的前台是用了 vue 全家桶,启动了一个 9527 端口。

而我的后台是用 nodeJS,启动了 8081 端口。

很明显,这种情况就出现了头疼的跨域。

贴出我的代码,如下

server.js(后台)

var app = express();
var server = require('http').createServer(app);
var io = require('socket.io')(server);
io.sockets.on('connection', (socket) => {
 console.log('123')
});

main.js(前台)

import VueSocketio from 'vue-socket.io'
import socketio from 'socket.io-client'
Vue.use(VueSocketio, socketio('http://localhost:8081'), store)

然后根据网上的写法,我在后端对跨域进行了处理

app.all('*',function (req, res, next) {
 res.header('Access-Control-Allow-Origin', 'http://localhost:9527');
 res.header('Access-Control-Allow-Headers', 'X-Token, Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
 res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
 if (req.method == 'OPTIONS') {
 res.send(200); /*让options请求快速返回*/
 }
 else {
 next();
 }
});

满心欢喜的重启前台看下有没有脸上。

结果出现了一下错误

浅谈vue websocket nodeJS 进行实时通信踩到的坑

Failed to load http://localhost:8081/socket.io/?EIO=3&transport=polling&t=MAqqfjf: The value of the 'Access-Control-Allow-Credentials' header in the response is '' which must be 'true' when the request's credentials mode is 'include'. Origin 'http://localhost:9527' is therefore not allowed access. The credentials mode of requests initiated by the XMLHttpRequest is controlled by the withCredentials attribute.

这个错误。。我看得出是是 “Access-Control-Allow-Credentials” 的问题。所以我又改了后台的跨域代码

app.all('*',function (req, res, next) {
 res.header('Access-Control-Allow-Origin', 'http://localhost:9527');
 res.header('Access-Control-Allow-Headers', 'X-Token, Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild');
 res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
 res.header('Access-Control-Allow-Credentials','true'); // 新增
 if (req.method == 'OPTIONS') {
 res.send(200); /*让options请求快速返回*/
 }
 else {
 next();
 }
});

更改过后,我又满心欢喜的跑去前台,一看

结果就一直报错:

浅谈vue websocket nodeJS 进行实时通信踩到的坑

GET http://localhost:8081/socket.io/?EIO=3&transport=polling&t=MAqp7zN 404 (Not Found)

GET http://localhost:8081/socket.io/?EIO=3&transport=polling&t=MAqp7zN 404 (Not Found)

报错了这个是 404 。

百度了很久, 各种关键字都搞不了。最后去 google 了。结果让我找到了答案:

浅谈vue websocket nodeJS 进行实时通信踩到的坑

看了上面这个答案,我翻查了一下,正好我也是用 express4 的。所以我就按照他的说法去改。结果如下。

正确的写法

后端

var server = app.listen(8081); 
var io = require('socket.io').listen(server);
io.sockets.on('connection', (socket) => {
 console.log('123')
});

前端的写法不变。

思考点

虽然我不知道背后发生了什么事(因为是赶项目,赶鸭子上架写 node 和 vue 的,本人是 Java 开发),但是我还是觉得有几个点要注意的:

1、关于 Express 4 和 其他版本中,socketio 的写法不同,少了一个 http 模块。所以我认为是出现这种情况的主要原因

2、注意跨域的写法。四行代码,最好能够保存下来。

3、如果是本地测试的,需要注意 IP 问题。如果是 localhost 的,请前后端一直;如果是 127.0.0.1,请前后端一致。

以上这篇浅谈vue websocket nodeJS 进行实时通信踩到的坑就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
Nodejs sublime text 3安装与配置
Jun 19 NodeJs
nodejs命令行参数处理模块commander使用实例
Sep 17 NodeJs
nodejs进阶(6)—连接MySQL数据库示例
Jan 07 NodeJs
nodejs连接mysql数据库简单封装示例-mysql模块
Apr 10 NodeJs
NodeJS实现图片上传代码(Express)
Jun 30 NodeJs
nodejs接入阿里大鱼短信验证码的方法
Jul 10 NodeJs
详解nodejs通过代理(proxy)发送http请求(request)
Sep 22 NodeJs
详解使用PM2管理nodejs进程
Oct 24 NodeJs
nodejs发送http请求时遇到404长时间未响应的解决方法
Dec 10 NodeJs
Nodejs模块载入运行原理
Feb 23 NodeJs
webstorm中配置nodejs环境及npm的实例
May 15 NodeJs
nodejs 使用 js 模块的方法实例详解
Dec 04 NodeJs
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
Aug 20 #NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 #NodeJs
通过实例了解Nodejs模块系统及require机制
Jul 16 #NodeJs
Nodejs环境实现socket通信过程解析
Jul 03 #NodeJs
使用nodejs实现JSON文件自动转Excel的工具(推荐)
Jun 24 #NodeJs
nodejs各种姿势断点调试的方法
Jun 18 #NodeJs
在NodeJs中使用node-schedule增加定时器任务的方法
Jun 08 #NodeJs
You might like
PHP速成大法
2015/01/30 PHP
基于jquery的给文章加入关键字链接
2010/10/26 Javascript
用jquery存取照片的具体实现方法
2013/06/30 Javascript
js算法中的排序、数组去重详细概述
2013/10/14 Javascript
浏览器图片选择预览、旋转、批量上传的JS代码实现
2013/12/04 Javascript
使用Nodejs开发微信公众号后台服务实例
2014/09/03 NodeJs
基于javascript实现判断移动终端浏览器版本信息
2014/12/09 Javascript
JavaScript数组对象赋值用法实例
2015/08/04 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
Vue.js基础知识小结
2017/01/13 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
JavaScript实现单击网页任意位置打开新窗口与关闭窗口的方法
2017/09/21 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
vue swipeCell滑动单元格(仿微信)的实现示例
2020/09/14 Javascript
[58:29]DOTA2-DPC中国联赛 正赛 Phoenix vs XG BO3 第一场 1月31日
2021/03/11 DOTA
详细分析python3的reduce函数
2017/12/05 Python
Python cookbook(数据结构与算法)找出序列中出现次数最多的元素算法示例
2018/03/15 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
基于Python爬取51cto博客页面信息过程解析
2020/08/25 Python
如何使用python自带IDLE的几种方法
2020/10/10 Python
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
英国最大的宝石首饰超市:QP Jewellers
2018/09/23 全球购物
大学自荐信
2013/12/12 职场文书
党校培训思想汇报
2014/01/03 职场文书
天网工程实施方案
2014/03/26 职场文书
组织鉴定材料
2014/06/02 职场文书
学习张林森心得体会
2014/09/10 职场文书
婚宴主持词
2015/06/30 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
面试必问:圣杯布局和双飞翼布局的区别
2021/05/13 HTML / CSS
深入浅析Redis 集群伸缩原理
2021/05/15 Redis
sql字段解析器的实现示例
2021/06/23 SQL Server
Python torch.flatten()函数案例详解
2021/08/30 Python