浅谈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中启用ECMAScript 6小结(windos以及Linux)
Jul 15 NodeJs
nodejs批量修改文件编码格式
Jan 22 NodeJs
浅谈NodeJS中require路径问题
May 07 NodeJs
详解nodejs 文本操作模块-fs模块(二)
Dec 22 NodeJs
nodejs中模块定义实例详解
Mar 18 NodeJs
NodeJs模拟登陆正方教务
Apr 28 NodeJs
解决Nodejs全局安装模块后找不到命令的问题
May 15 NodeJs
Nodejs 发布自己的npm包并制作成命令行工具的实例讲解
May 15 NodeJs
nodejs中函数的调用实例详解
Oct 31 NodeJs
nodejs使用socket5进行代理请求的实现
Feb 21 NodeJs
Nodejs 微信小程序消息推送的实现
Jan 20 NodeJs
分享node.js实现简单登录注册的具体代码
Apr 26 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 程序员也要学会使用“异常”
2009/06/16 PHP
php防盗链的常用方法小结
2010/07/02 PHP
深入解析php之apc
2013/05/15 PHP
PHP获取一年有几周以及每周开始日期和结束日期
2015/08/06 PHP
PHP微信网页授权的配置文件操作分析
2019/05/29 PHP
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
自动设置iframe大小的jQuery代码
2013/09/11 Javascript
JavaScript数值数组排序示例分享
2014/05/27 Javascript
原生Ajax 和jQuery Ajax的区别示例分析
2014/12/17 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
谈谈jQuery Ajax用法详解
2015/11/27 Javascript
WordPress中利用AJAX技术进行评论提交的实现示例
2016/01/12 Javascript
第一次接触神奇的Bootstrap表单
2016/07/27 Javascript
js 基础篇必看(点击事件轮播图的简单实现)
2016/08/20 Javascript
bootstarp modal框居中显示的实现代码
2017/02/18 Javascript
js实现仿购物车加减效果
2017/03/01 Javascript
BootStrap selectpicker后台动态绑定数据
2017/06/01 Javascript
解决Vue不能检测数组或对象变动的问题
2018/02/24 Javascript
在vue中更换字体,本地存储字体非引用在线字体库的方法
2018/09/28 Javascript
python3监控CentOS磁盘空间脚本
2018/06/21 Python
设置python3为默认python的方法
2018/10/31 Python
详解Python循环作用域与闭包
2019/03/21 Python
pandas.DataFrame的pivot()和unstack()实现行转列
2019/07/06 Python
Django项目创建到启动详解(最全最详细)
2019/09/07 Python
在python中求分布函数相关的包实例
2020/04/15 Python
python中upper是做什么用的
2020/07/20 Python
Python基于unittest实现测试用例执行
2020/11/25 Python
css3学习之2D转换功能详解
2016/12/23 HTML / CSS
工程承诺书怎么写
2014/05/24 职场文书
企业宣传标语
2014/06/09 职场文书
外贸业务员求职信
2014/06/16 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
重阳节活动主持词
2015/07/04 职场文书
Nginx location 和 proxy_pass路径配置问题小结
2021/09/04 Servers
Linux服务器离线安装 nginx的详细步骤
2022/06/16 Servers
Win11 PC上的Outlook搜索错误怎么办?
2022/07/15 数码科技