浅谈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的子进程(child_process)调用系统命令的方法分享
Jun 05 NodeJs
基于NodeJS的前后端分离的思考与实践(一)全栈式开发
Sep 26 NodeJs
NodeJS学习笔记之(Url,QueryString,Path)模块
Jan 13 NodeJs
nodejs URL模块操作URL相关方法介绍
Mar 03 NodeJs
基于nodejs+express4.X实现文件下载的实例代码
Jul 13 NodeJs
利用nodeJs anywhere搭建本地服务器环境的方法
May 12 NodeJs
Nodejs异步回调之异常处理实例分析
Jun 22 NodeJs
基于Nodejs的Tcp封包和解包的理解
Sep 19 NodeJs
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
May 30 NodeJs
浅谈使用nodejs搭建web服务器的过程
Jul 20 NodeJs
Node.js实现爬取网站图片的示例代码
Apr 04 NodeJs
浅谈Node的内存泄露问题
May 06 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程序中的常见漏洞进行攻击(下)
2006/10/09 PHP
PHP高级对象构建 工厂模式的使用
2012/02/05 PHP
php生成扇形比例图实例
2013/11/06 PHP
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
PHP的Yii框架的基本使用示例
2015/08/21 PHP
浅谈socket同步和异步、阻塞和非阻塞、I/O模型
2016/12/15 PHP
在textarea文本域中显示HTML代码的方法
2007/03/06 Javascript
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
使用Node.js配合Nginx实现高负载网络
2015/06/28 Javascript
node.js+express制作网页计算器
2016/01/17 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
AngularJS实现ajax请求的方法
2016/11/22 Javascript
react-native中ListView组件点击跳转的方法示例
2017/09/30 Javascript
Vuex,iView UI面包屑导航使用扩展详解
2019/11/04 Javascript
[01:00:10]完美世界DOTA2联赛PWL S2 FTD vs Inki 第二场 11.21
2020/11/24 DOTA
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
浅析Python中的多重继承
2015/04/28 Python
Django与遗留的数据库整合的方法指南
2015/07/24 Python
Python的mysql数据库的更新如何实现
2017/07/31 Python
Python实现读取机器硬件信息的方法示例
2018/06/09 Python
Python实现多属性排序的方法
2018/12/05 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
解析Python3中的Import
2019/10/13 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
python用pip install时安装失败的一系列问题及解决方法
2020/02/24 Python
Django表单提交后实现获取相同name的不同value值
2020/05/14 Python
Python定时任务APScheduler安装及使用解析
2020/08/07 Python
python help函数实例用法
2020/12/06 Python
出纳的岗位职责
2013/11/09 职场文书
财政局长自荐信范文
2013/12/22 职场文书
法制宣传月活动方案
2014/05/11 职场文书
盗窃罪辩护词范文
2015/05/21 职场文书
2015年小学体育工作总结
2015/05/22 职场文书
优秀教师主要事迹材料
2015/11/04 职场文书