浅谈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 相关文章推荐
golang、python、php、c++、c、java、Nodejs性能对比
Mar 12 NodeJs
nodejs获取本机内网和外网ip地址的实现代码
Jun 01 NodeJs
轻松创建nodejs服务器(10):处理上传图片
Dec 18 NodeJs
nodejs批量修改文件编码格式
Jan 22 NodeJs
Nodejs学习笔记之测试驱动
Apr 16 NodeJs
nodeJs爬虫获取数据简单实现代码
Mar 29 NodeJs
nodejs连接mongodb数据库实现增删改查
Dec 01 NodeJs
详解NodeJs支付宝移动支付签名及验签
Jan 06 NodeJs
nodejs个人博客开发第六步 数据分页
Apr 12 NodeJs
nodejs用gulp管理前端文件方法
Jun 24 NodeJs
nodejs对mongodb数据库的增加修删该查实例代码
Jan 05 NodeJs
nodeJS与MySQL实现分页数据以及倒序数据
Jun 05 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 之 没有mysql支持时的替代方案
2006/10/09 PHP
php下实现一个阿拉伯数字转中文数字的函数
2008/07/10 PHP
PHP随机数生成代码与使用实例分析
2011/04/08 PHP
PHP管理依赖(dependency)关系工具 Composer的自动加载(autoload)
2014/08/18 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
Javascript isArray 数组类型检测函数
2009/10/08 Javascript
cnblogs中在闪存中屏蔽某人的实现代码
2010/11/14 Javascript
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
2015/02/28 Javascript
两种JS实现屏蔽鼠标右键的方法
2020/08/20 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
JS仿QQ好友列表展开、收缩功能(第一篇)
2017/07/07 Javascript
微信小程序实现tab切换效果
2017/11/21 Javascript
vue3.0 CLI - 2.6 - 组件的复用入门教程
2018/09/14 Javascript
jQuery列表动态增加和删除的实现方法
2020/11/05 jQuery
python和C语言混合编程实例
2014/06/04 Python
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
2016/04/11 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
解决python xlrd无法读取excel文件的问题
2018/12/25 Python
pytorch中如何使用DataLoader对数据集进行批处理的方法
2019/08/06 Python
django基础学习之send_mail功能
2019/08/07 Python
详解Python中第三方库Faker
2020/09/25 Python
纽约复古灵感的现代珠宝品牌:Lulu Frost
2018/03/03 全球购物
Sneaker Studio捷克:购买运动鞋
2018/07/08 全球购物
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
给同学的道歉信
2014/01/16 职场文书
大学毕业生求职自荐书
2014/06/05 职场文书
男方婚前保证书
2015/02/28 职场文书
幼儿园重阳节活动总结
2015/05/05 职场文书
golang 实现并发求和
2021/05/08 Golang
python实现自定义日志的具体方法
2021/05/28 Python
PostgreSQL基于pgrouting的路径规划处理方法
2022/04/18 PostgreSQL
Spring Cloud OAuth2实现自定义token返回格式
2022/06/25 Java/Android