浅谈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中exports与module.exports的区别详细介绍
Jan 14 NodeJs
nodejs npm install全局安装和本地安装的区别
Jun 05 NodeJs
NodeJS Web应用监听sock文件实例
Feb 18 NodeJs
nodejs简单实现中英文翻译
May 04 NodeJs
nodejs导出excel的方法
Jun 30 NodeJs
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
Aug 21 NodeJs
详解nodejs 文本操作模块-fs模块(五)
Dec 23 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
详解使用nodeJs安装Vue-cli
May 17 NodeJs
Nodejs中使用captchapng模块生成图片验证码
May 18 NodeJs
Nodejs 和Session 原理及实战技巧小结
Aug 25 NodeJs
Sublime Text3 配置 NodeJs 环境的方法
May 20 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
thinkphp的CURD和查询方式介绍
2013/12/19 PHP
50款非常棒的 jQuery 插件分享
2012/03/29 Javascript
给Flash加一个超链接(推荐使用透明层)兼容主流浏览器
2013/06/09 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
通过js为元素添加多项样式,浏览器全兼容写法
2014/08/30 Javascript
EasyUi datagrid 实现表格分页
2015/02/10 Javascript
JavaScript跨浏览器获取页面中相同class节点的方法
2015/03/03 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
Javascript OOP之面向对象
2016/07/31 Javascript
最常见的左侧分类菜单栏jQuery实现代码
2016/11/28 Javascript
vuejs如何配置less
2017/04/25 Javascript
微信小程序之购物车功能
2020/09/23 Javascript
浅谈Angular路由守卫
2017/08/26 Javascript
解决vue-quill-editor上传内容由于图片是base64的导致字符太长的问题
2018/08/20 Javascript
vue 自定义指令自动获取文本框焦点的方法
2018/08/25 Javascript
Koa日志中间件封装开发详解
2019/03/09 Javascript
11个教程中不常被提及的JavaScript小技巧(推荐)
2019/04/17 Javascript
Python列表切片用法示例
2017/04/19 Python
python list元素为tuple时的排序方法
2018/04/18 Python
浅谈python requests 的put, post 请求参数的问题
2019/01/02 Python
Python中使用双下划线防止类属性被覆盖问题
2019/06/27 Python
Numpy与Pytorch 矩阵操作方式
2019/12/27 Python
python实现简单飞行棋
2020/02/06 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
出国留学计划书
2014/04/27 职场文书
乡镇干部个人对照检查材料思想汇报(原创篇)
2014/09/28 职场文书
个人批评与自我批评材料
2014/10/17 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
小学语文教学反思范文
2016/03/03 职场文书
60句有关成长的名言
2019/09/04 职场文书
导游词之海南-南湾猴岛
2019/10/12 职场文书
Oracle 区块链表创建过程详解
2021/05/15 Oracle
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
GoFrame基于性能测试得知grpool使用场景
2022/06/21 Golang