Pusher连接成功但收不到频道消息是怎么回事?
我用Pusher在前端监听一个私有频道,控制台显示连接成功了(状态是connected),也订阅上了频道,但就是收不到后端发来的事件。我已经确认后端确实触发了事件,而且App Key、Cluster这些配置都没问题。
尝试过换成公开频道测试,还是不行。是不是鉴权哪里出错了?但如果是鉴权问题,应该连订阅都失败才对啊……现在完全卡住了。
const pusher = new Pusher('my-app-key', {
cluster: 'ap1',
encrypted: true
});
const channel = pusher.subscribe('private-user-123');
channel.bind('new-message', function(data) {
console.log('收到消息:', data);
});
1. 事件名完全一致
后端触发的事件名必须和前端
bind的名字完全一样,包括大小写。很多时候后端写的是new-message但前端bind的是NewMessage之类的。2. 私有频道的事件名前缀
如果是服务端触发事件,事件名不要加
client-前缀,那是客户端发消息才用的。如果你不小心用了client-new-message,服务端发这个事件是发不出去的。3. 后端发送的频道名
确认后端触发时填的频道名是
private-user-123,不是写错了或者漏了private-前缀。4. 调试方法
在 bind 之前先监听所有事件看看:
这样能看清楚到底收到什么事件没。
如果上面都确认没问题,那可能是鉴权的坑——Pusher 的私有频道订阅成功不代表鉴权完全通过,有些服务器配置下鉴权请求失败了也会显示订阅成功。你可以看看 Network 面板里那个
/pusher/auth请求返回的状态码和响应内容。把后端触发事件的代码贴出来看看更直观。
最可能的原因:后端触发事件时的事件名或频道名跟你前端对不上。
检查一下后端代码,看看触发事件时传的参数是不是和前端一致:
注意事件名
new-message要和前端channel.bind('new-message', ...)完全一致,包括大小写。还有一个容易踩的坑:如果你的事件是客户端发起的(前端trigger),私有频道需要加
client-前缀:但你说后端触发的事件,那就不需要这个前缀。
如果还是不行,打开Pusher的debug模式看看事件流通:
这样能看到事件有没有从后端发出来、发给哪个频道。
你后端触发事件的代码能贴一下吗?这样能直接定位问题。