最近公司的一个vue项目用到了vue-socket.io来处理socket数据传输,以前用过socket.io-client,如今知道vue-socket.io是基于socket.io-client的一层封装,将socket挂于全局从而更方便的书写。vue
因而把代码拉取下来运行:node
什么鬼,一样的代码为何个人就接收不到数据,本身新建一个测试一下吧!vue-cli
先用express和socket.io搭个小socket服务器:express
let express = require('express'); let app = express(); let server= require('http').Server(app); let io = require('socket.io')(server); io.on('connect', (socket) => { setInterval(() => { socket.emit('hi','hello') },2000) socket.on('hello', (data) => { console.log('hello',data) socket.emit('hi','get it') }) socket.on('disconnect', (data) => { console.log('断开', data) }) }) server.listen(8080);
再搭个vue-cli3环境,main.js里use一下socket:npm
import Vue from 'vue' import App from './App.vue' import VueSocketIO from 'vue-socket.io' Vue.config.productionTip = false Vue.use(new VueSocketIO({ debug: true, connection: 'http://127.0.0.1:8080', })) new Vue({ render: h => h(App), }).$mount('#app')
再去组件里监听一下:json
<script> export default { sockets: { connect() { console.log('连接成功'); }, disconnect() { console.log('断开连接') }, reconnect() { console.log('从新连接') }, hi(res) { console.log('VueSocketIO', res) } } } </script>
结果:api
为何,是socket数据没发送过来吗?我装个socket.io-client试试:浏览器
import io from 'socket.io-client' export default { mounted() { io('http://127.0.0.1:8080').on('hi', (res) => { console.log('socket.io-client', res) }) }, }
没问题,数据传过来了,但vue-socket.io为啥不行,无论了,先向服务端发送一条信息看能不能收到:this.$socket.emit('hello','i am wk')
没问题,收到了,因此如今是socket已经链接上了,客户端能够向服务端正常发送数据,但服务端也向客户端发送数据了,上面用socket.io-client能够正常接收已经证实这一点了,问题是vue-socket.io没有正确写法去接收数据,彷佛api上的写法出bug了。
打印一下this发现由于引入vue-socket.io的缘由,this上面挂了一个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再从新npm install,这样也许是由于缓存的缘由(尽管我也试太重新install以前经过npm cache clean --force清除缓存,删掉package-lock.json,清除浏览器缓存,这些都试过,但仿佛总还有其它缓存使得vue-socket.io的版本没有切换到3.07,这个多是npm包的某种机制,之后有机会深刻研究一下,有知道的同窗但愿留言分享一下!!! ),成功的作法是,删掉node_modules,删掉package.json中vue-socket.io哪一行,而后npm install,而后npm install vue-socket.io@3.0.7,这样node_modules中的版本才真正变成3.0.7,socket也能正常使用了。