我目前正在开发一个实时应用程序,该应用程序允许用户将其他人添加到“团队”中,我想通知用户他们已被实时添加。然而,我无法终生致力于如何实现这一点,我认为最让我困惑的是文档,
The user must be subscribed to the channel that the event is being triggered on
这怎么可能?当然,我正在尝试实时将某人添加到一个组中,并且该组是一个独特的 channel ,他们也不能订阅吗?
这是我的尝试以及过程的解释。
1) 用户登录应用程序并订阅他们独有的 channel “presence-user_{id}”,其中 id 是数据库中的用户 ID。
2)其他地方的用户想要将用户添加到他们的组中,选择运行以下代码的用户,
App['presence-' + 'user_' + newUser.get('id')] = App.pusher.subscribe('presence-user_' + newUser.get('id'));
App['presence-' + 'user_' + newUser.get('id')].trigger('client-user-added', { project : self.model.get('id') });
newUser 是一个主干模型,详细说明了所选用户的用户详细信息。我在这里尝试做的是将尝试将用户加入到该用户 channel 的组的用户订阅。
这应该会触发这个方法监听器,
App['presence-' + 'user_' + App.Session.get('user_id')].bind('client-user-added', this.RT_addProject, this);
这又应该在添加的客户端应用程序上触发以下方法,
RT_addProject: function(data) {
console.log(data);
},
然而事实并非如此。触发客户端事件的正确方法是什么?
TLDR;我想在使用推送器将用户添加到组时实时通知用户。
最佳答案
presence channels的要点是:
- 在线状态 channel 名称应在您希望加入群组的用户之间共享 - 订阅 channel 的行为会将他们添加到 channel 中。
- channel 上的每个用户都需要您通过服务器提供的唯一 ID(可能是用户 session ID),通过 auth callback 。这可以在 channel 上唯一地标识他们。
- 如果身份验证成功,他们就会被订阅。订阅后,客户端通过
pusher:subscription_succeeded
事件获取 channel 上现有用户的初始列表。 - 通过
pusher:member_added
事件向 channel 的现有订阅者通知新用户的存在。 - 当用户离线(关闭浏览器、在页面之间导航或通过代码取消订阅)时, channel 上的所有其他用户都会通过
pusher:member_removed
事件得知该用户已离开 channel 。<
例如。在客户端:
var pusher = new Pusher(APP_KEY);
var chatChannel = pusher.subscribe('presence-chat');
chatChannel.bind('pusher:subscription_succeeded', function(members) {
members.each(memberAdded);
});
chatChannel.bind('pusher:member_added', memberAdded);
chatChannel.bind('pusher:member_removed', memberRemoved);
function memberAdded(member) {
// add to UI etc.
}
function memberRemoved(member) {
// remove from UI etc.
}
订阅行为会导致 Pusher JS 库生成 auth POST request到服务器端点。
服务器伪代码:
var channelName = authRequest.postParam['channel-name'];
var socketId = authRequest.postParam['socket-id'];
var pusher = new Pusher(YOUR_CREDENTIALS);
if( currentSessionUserAllowedToSubscribeToChannel(channelName) ) {
var uniqueUserId = getCurrentSessionUserUniqueId();
var customUserInfo = getCustomUserInfo();
var authSignature = pusher.presence_auth(channelName,
uniqueUserId,
customUserInfo);
send200AuthJSONToClient(authSignature);
}
else {
send401ToClient();
}
What is the correct method of triggering client events?
一旦订阅成功,客户端事件只能在私有(private)或在线 channel 上触发:
var pusher = new Pusher(APP_KEY);
var chatChannel = pusher.subscribe('presence-chat');
chatChannel.bind('pusher:subscription_succeeded', function() {
var wasTriggered = pusher.trigger('client-event', {some: 'data'});
console.log(wasTriggered);
});
TLDR; I want notify a user in realtime when they are added to a group using pusher.
如果用户 A 希望用户 B 加入 channel X,那么您需要向用户 B 发送有关 channel X 存在的信号,以便他们可以订阅它。
userB 只能接收他们订阅的 channel 上的事件。因此,用户 A 需要以某种方式在用户 B 知道的 channel 上发送事件。一个常见的解决方案是为每个用户提供一个 channel ,例如userA-notifications
并且 userA 需要通过服务器触发此 channel 上的事件。最终,您需要一个权限来阻止触发不需要的事件。
此答案与上述过程相关:https://stackoverflow.com/a/28165893/39904
关于javascript - 为用户触发推送客户端事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31266170/