浅谈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的url截取模块url-extract的使用实例
Nov 18 NodeJs
轻松创建nodejs服务器(5):事件处理程序
Dec 18 NodeJs
nodejs微信公众号支付开发
Sep 19 NodeJs
nodejs使用express获取get和post传值及session验证的方法
Nov 09 NodeJs
详解NODEJS的http实现
Jan 04 NodeJs
nodejs实现连接mongodb数据库的方法示例
Mar 15 NodeJs
nodejs高大上的部署方式(PM2)
Sep 11 NodeJs
深入理解nodejs搭建静态服务器(实现命令行)
Feb 05 NodeJs
nodejs微信开发之自动回复的实现
Mar 17 NodeJs
nodejs实现聊天机器人功能
Sep 19 NodeJs
nodejs实现UDP组播示例方法
Nov 04 NodeJs
NodeJS http模块用法示例【创建web服务器/客户端】
Nov 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 5.0 Pear安装方法
2006/12/06 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
jquery tools系列 expose 学习
2009/09/06 Javascript
Javascript remove 自定义数组删除方法
2009/10/20 Javascript
对字符串进行HTML编码和解码的JavaScript函数
2010/02/01 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
你可能不知道的JavaScript的new Function()方法
2014/04/17 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
js实现鼠标感应图片展示的方法
2015/02/27 Javascript
JQuery记住用户名密码实现下次自动登录功能
2015/04/27 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
原生JS实现跑马灯效果
2017/02/20 Javascript
addEventListener()与removeEventListener()解析
2017/04/20 Javascript
vue-router单页面路由
2017/06/17 Javascript
Vue学习笔记进阶篇之函数化组件解析
2017/07/21 Javascript
微信小程序模版渲染详解
2018/01/26 Javascript
vuex与组件联合使用的方法
2018/05/10 Javascript
Node.js一行代码实现静态文件服务器的方法步骤
2019/05/07 Javascript
Javascript Web Worker使用过程解析
2020/03/16 Javascript
JavaScript arguments.callee作用及替换方案详解
2020/09/02 Javascript
[02:12]探秘2016国际邀请赛中国区预选赛选手房间
2016/06/25 DOTA
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
python获得文件创建时间和修改时间的方法
2015/06/30 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
python-docx修改已存在的Word文档的表格的字体格式方法
2018/05/08 Python
python实现支付宝转账接口
2019/05/07 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
比利时买床:Beter Bed
2017/12/06 全球购物
作风建设年活动实施方案
2014/10/24 职场文书
2014年政协工作总结
2014/12/09 职场文书
小学家庭教育心得体会
2016/01/14 职场文书
python_tkinter弹出对话框创建
2022/03/20 Python
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫