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的频道分两种:公共频道直接写名字就能用,但私有频道(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- 前缀,十有八九是这个问题。