Pusher 私人频道订阅中的意外错误
Unexpected error in Pusher private channel subscription
在 JS+PHP (homestead) 环境中,订阅 Pusher 中的 public 频道工作正常(也验证了我的凭据)。订阅私人频道失败,代码如下:
let theAppId = 'XXXYYYZZZ'; //fake credentials shown here...
pusher = new Pusher(theAppId, {
authEndpoint: '/pusher/auth',
cluster: 'us2',
forceTLS: true,
encrypted: true,
auth: {headers: {'X-CSRF-Token': self.csrf}}
});
channel = pusher.subscribe('private-channel1');
我的授权代码被调用并且returns一个有效的授权信号:
{\"auth\":\"c289b20c368bd23a4a85:d55f1f1495f0d252b5fde1d69e2e6d5b4b161ca49cab5ad218d65111ae307a12\"}"}
连接成功后,Pusher.log显示此错误:
Pusher : Event recd : {"event":"pusher:error","data":{"code":null,"message":"Invalid key in subscription auth data: '{\"auth\"'"}}
pusher.min.js:8 Pusher : Error : {"type":"WebSocketError","error":{"type":"PusherError","data":{"code":null,"message":"Invalid key in subscription auth data: '{\"auth\"'"}}}
我在 Pusher 文档中找不到任何关于此问题的提及。有人看到过这个,或者对如何解决有想法吗?
此错误最可能的原因是 auth
散列在从服务器 return 之前是 "stringified"。这就是错误消息提到 发现无效键 的原因:无法将值解析为 JSON 对象。
要解决此问题,服务器需要 return plain JSON。
感谢 Hosam 的提示。您 Laravel 用户的问题很容易解决。请注意,您的身份验证路由的响应是 json。从 pusher->socket_auth
创建有效授权密钥的返回值是一个 json 编码的字符串。要解决这个问题,只需 json_decode
对关联数组的 socket_auth
响应,然后将其传递到您的控制器中 json 响应:
$thePusher = new \Pusher\Pusher(
env('PUSHER_APP_KEY'),env('PUSHER_APP_SECRET'),env('PUSHER_APP_ID'),
['cluster'=>env('PUSHER_CLUSTER'),'useTLS'=>true]
);
$theResult=$thePusher->socket_auth(
$aRequest>input('channel_name'),
$aRequest->input('socket_id'));
return response()->json(json_decode($theResult,true),200);
在 JS+PHP (homestead) 环境中,订阅 Pusher 中的 public 频道工作正常(也验证了我的凭据)。订阅私人频道失败,代码如下:
let theAppId = 'XXXYYYZZZ'; //fake credentials shown here...
pusher = new Pusher(theAppId, {
authEndpoint: '/pusher/auth',
cluster: 'us2',
forceTLS: true,
encrypted: true,
auth: {headers: {'X-CSRF-Token': self.csrf}}
});
channel = pusher.subscribe('private-channel1');
我的授权代码被调用并且returns一个有效的授权信号:
{\"auth\":\"c289b20c368bd23a4a85:d55f1f1495f0d252b5fde1d69e2e6d5b4b161ca49cab5ad218d65111ae307a12\"}"}
连接成功后,Pusher.log显示此错误:
Pusher : Event recd : {"event":"pusher:error","data":{"code":null,"message":"Invalid key in subscription auth data: '{\"auth\"'"}}
pusher.min.js:8 Pusher : Error : {"type":"WebSocketError","error":{"type":"PusherError","data":{"code":null,"message":"Invalid key in subscription auth data: '{\"auth\"'"}}}
我在 Pusher 文档中找不到任何关于此问题的提及。有人看到过这个,或者对如何解决有想法吗?
此错误最可能的原因是 auth
散列在从服务器 return 之前是 "stringified"。这就是错误消息提到 发现无效键 的原因:无法将值解析为 JSON 对象。
要解决此问题,服务器需要 return plain JSON。
感谢 Hosam 的提示。您 Laravel 用户的问题很容易解决。请注意,您的身份验证路由的响应是 json。从 pusher->socket_auth
创建有效授权密钥的返回值是一个 json 编码的字符串。要解决这个问题,只需 json_decode
对关联数组的 socket_auth
响应,然后将其传递到您的控制器中 json 响应:
$thePusher = new \Pusher\Pusher(
env('PUSHER_APP_KEY'),env('PUSHER_APP_SECRET'),env('PUSHER_APP_ID'),
['cluster'=>env('PUSHER_CLUSTER'),'useTLS'=>true]
);
$theResult=$thePusher->socket_auth(
$aRequest>input('channel_name'),
$aRequest->input('socket_id'));
return response()->json(json_decode($theResult,true),200);