当前位置: 首页 > Web前端 > vue.js

vue-socket.io3.08、3.09有bug无法接收数据

时间:2023-03-31 19:42:55 vue.js

最近公司的一个vue项目使用vue-socket.io来处理socket数据传输。之前用过socket.io-client,现在才知道vue-socket.io是在socket.io-client的基础上再封装一层,全局挂掉socket,写起来更方便。于是把代码拉下来跑了一下:搞什么鬼,为什么我的同样的代码收不到数据,自己新建一个自己测试!首先使用express和socket.io搭建一个小型socket服务器:letexpress=require('express');letapp=express();letserver=require('http').Server(app);letio=require('socket.io')(server);io.on('connect',(socket)=>{setInterval(()=>{socket.emit('hi','hello')},2000)套接字。on('hello',(data)=>{console.log('hello',data)socket.emit('hi','getit')})socket.on('disconnect',(data)=>{console.log('disconnected',data)})})server.listen(8080);并搭建vue-cli3环境,在main.js中使用socket:importVuefrom'vue'importAppfrom'./App.vue'importVueSocketIOfrom'vue-socket.io'Vue.config.productionTip=falseVue。使用(newVueSocketIO({debug:true,connection:'http://127.0.0.1:8080',}))newVue({render:h=>h(App),}).$mount('#app')再去组件监听:结果:为什么,socket数据没有发送?我安装了一个socket.io-client来尝试:importiofrom'socket.io-client'exportdefault{mounted(){io('http://127.0.0.1:8080').on('hi',(res)=>{console.log('socket.io-client',res)})},}没问题,数据已经传过去了,但是为什么vue-socket.io不行,不管了,发给服务器先发一条消息,看看能不能收到:this.$socket.emit('hello','iamwk')没问题,已经收到了,所以现在socket已经连接上了,客户端可以正常向服务器发送数据。但是服务器也已经向客户端发送了数据。已经证明socket.io-client可以正常接收数据。问题是vue-socket.io没有正确的接收数据的写法。好像是api上的写法有bug。打印看了一下这个,发现因为vue-socket.io的引入,在这个上面挂了一个sockets属性:this.sockets下面有一个listener属性,感觉这个名字有意思。试试:this.sockets.listener.subscribe('hi',(data)=>{console.log('++++++++++',data)})哇,可以用了,嗯,先这么用吧,虽然我还是不懂sockets:{}这种写法为什么不行。有知道的请给我留言!今天感谢一些同学的提示,自己试了一下,发现vue-socket.io3.08和3.09版本都有这样的问题,3.07可以正常使用。需要注意的是,切换到3.07版本时,不要直接修改package.json文件中的版本,删除整个node_modules,然后重新npminstall,这可能是缓存的原因(虽然我也试过重新安装重新安装之前通过npmcacheclean--force清除缓存,删除package-lock.json,清除浏览器缓存,这些都试过了,但是好像总是有其他的缓存使得vue-socket的版本.io没有切换到3.07,这可能是npm包的某种机制,以后有机会深入研究,知道的同学希望留言分享!!!),成功了方法是删除node_modules,删除package.json中的vue-socket.io这一行,然后npminstall,再npminstallvue-socket.io@3.0.7,这样node_modules中的版本就真的变成了3.0.7,并且插座可以正常使用。