Pusher连接后收不到消息是怎么回事?
我用Pusher在前端监听频道,connect成功了,但就是收不到后端发的消息,很奇怪。
后端确认事件已经触发,Dashboard里也能看到连接在线。我前端代码是这样写的:
const pusher = new Pusher('MY_APP_KEY', {
cluster: 'ap1',
encrypted: true
});
const channel = pusher.subscribe('my-channel');
channel.bind('my-event', function(data) {
console.log('收到数据:', data);
});
频道名和事件名都跟后端对过了,完全一致,但回调就是不执行,控制台也没报错,这到底啥问题?
其次,可以在前端订阅频道的时候加个绑定,看看是否能捕获到连接成功后的事件,比如
pusher.connection.bind('connected', function() { console.log('Pusher connected!'); });这样可以确认连接状态。再者,确保你的浏览器没有阻止弹窗或者通知,因为有时候这些设置会影响事件的接收。
最后,检查一下网络是否有防火墙或者代理设置,有时候它们会干扰WebSocket连接。
希望这些建议能帮到你,如果问题依旧存在,可以尝试在不同的设备或者网络环境下测试一下。
Pusher的频道分两种:公共频道直接写名字就能用,但私有频道(private-开头)和存在频道(presence-开头)需要后端配置认证接口。
你检查一下后端触发事件的时候,代码大概是这样的吗:
Pusher::trigger('my-channel', 'my-event', $data)
// 如果是私有频道可能是:
Pusher::trigger('private-my-channel', 'my-event', $data)
如果后端触发的是 private-my-channel,但你前端订阅的是 my-channel(没有private-前缀),那这就是问题所在——收不到消息而且控制台不报错,非常坑。
解决办法有两个方向:
一是如果不需要认证,就把后端改成触发公共频道,去掉 private- 前缀。
二是如果确实要用私有频道,就要在后端配一个认证endpoint,前端初始化时加上 authorizer 参数:
const pusher = new Pusher('MY_APP_KEY', {
cluster: 'ap1',
encrypted: true,
authorizer: (channel, options) => {
return {
authorize: (socketId, callback) => {
fetch('/pusher/auth', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ socket_id: socketId, channel_name: channel.name })
})
.then(res => res.json())
.then(data => callback(null, data))
.catch(err => callback(err, null));
}
};
}
});
后端也得配一下认证路由,具体看用的是哪个框架。
你先去确认一下后端触发事件时用的频道名带不带 private- 前缀,十有八九是这个问题。