javascript - 为用户触发推送客户端事件

标签 javascript backbone.js real-time pusher

我目前正在开发一个实时应用程序,该应用程序允许用户将其他人添加到“团队”中,我想通知用户他们已被实时添加。然而,我无法终生致力于如何实现这一点,我认为最让我困惑的是文档,

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的要点是:

  1. 在线状态 channel 名称应在您希望加入群组的用户之间共享 - 订阅 channel 的行为会将他们添加到 channel 中。
  2. channel 上的每个用户都需要您通过服务器提供的唯一 ID(可能是用户 session ID),通过 auth callback 。这可以在 channel 上唯一地标识他们。
  3. 如果身份验证成功,他们就会被订阅。订阅后,客户端通过 pusher:subscription_succeeded 事件获取 channel 上现有用户的初始列表。
  4. 通过 pusher:member_added 事件向 channel 的现有订阅者通知新用户的存在。
  5. 当用户离线(关闭浏览器、在页面之间导航或通过代码取消订阅)时, 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/

相关文章:

javascript - Backbone : pass or retrieve details on a Collection update

javascript - 使用node.js和socket.io向用户显示实时数据

c# - 如何使用NAudio同时播放具有实时大小值的两个音频文件

javascript - phonegap 页面重定向不起作用,对象的属性 'location' 不是函数

javascript - 顺序主干 model.set 覆盖 model.changed 属性

javascript - backbone.js 和 Handlebars :string is not a function

hadoop - 为什么 Hadoop 不是一个实时平台

c# - SPItemEventReceiver 类中的确认框

javascript - 为什么不修改字符串的每个字符?

javascript - 如何让用户将我的网页下载为包含样式的 pdf 格式?