【问题标题】:Sails js with socket io: how to subscribe to new Model that fits criteria, during onCreate?Sails js with socket io:如何在onCreate期间订阅符合条件的新模型?
【发布时间】:2015-07-07 05:49:10
【问题描述】:

我正在使用 Sails js 0.11。

按照文档here 中描述的教程进行操作:

我能够创建发布/订阅关系。但是,我只想收到具有“company=abc”字段的用户的“更新”事件的通知。因此在控制器中我执行以下操作:

subscribe: function(req, res) {
    User.find({company:'abc"}).exec(function(e,listOfUsers){
      User.subscribe(req.socket,listOfUsers,['create','destroy']);
    });
}

这行得通。但是,如果此套接字已打开,并创建了属于该公司的新用户,则套接字将不会收到此新用户的通知。

为了解决这个问题,我去了用户模型,并添加了:

beforeCreate: function(user, next) {

 //just need one sample of user from this company.
 //in theory all users of this company are subscribed by same sockets
 User.findOne({company:user.company}).exec(function(e,companyUser){

    // Get all of the sockets that are subscribed to this user
    var subscribers = User.subscribers(companyUser);

    // Subscribe them all to this new user
    _.each(subscribers, function(subscriber) {
      User.subscribe(subscriber.id, user);
    });
     next();
 });

}

但是我收到警告

warn: `Model.subscribe()` called by a non-socket request. Only requests originating from a connected socket may be subscribed. Ignoring...

我不想使用套接字创建用户。有没有解决的办法?只想让我的套接字订阅者保持最新!

谢谢

【问题讨论】:

  • 原来上面有两个错误。它应该是 User.subscribe(subscriber, user);,我应该在 Model.afterCreate 上调用它。但是,即使我执行 User.publishCreate({id: user.id, user:user});

标签: sockets model socket.io


【解决方案1】:

实际上,将 this 放在 afterCreate 中并不会真正起作用,因为订阅者会在创建对象时收到消息,但是您将其放在创建对象之后,因此事件不会运行。

但是,我们可以通过一个技巧来完成这项工作。订阅公司而不是用户,以下是详细信息:

首先,为您的用户订阅它的公司(所有者是我的风帆应用程序中的公司 ID):

Company.findOne({id: req.session.user.owner}).exec(function(e, company) {
    Company.subscribe(req.socket, company);
});

然后,当您创建用户时,在 afterCreate 中,在您的套接字消息中查找公司 ID。检索该公司的所有订阅者,并将他们订阅到 User 模型的“消息”上下文。然后在您订阅所有用户之后,立即通过 Company 模型的 message() 函数向他们发送“消息”类型的消息。

  afterCreate: function(message, next) {
    Company.findOne({id: message.owner}).exec(function(e, company) {
        var subscribers = Company.subscribers(company);
        _.each(subscribers, function(subscriber) {
            User.subscribe(subscriber, message, 'message');
        });

        Company.message(company, message.message);
    });

    next();
  },

这里,消息对象是 socket.io 有效负载。在您将套接字客户端订阅到公司的第一部分中,您可以有条件来指定要订阅哪个用户的位置,甚至可以创建一个特定的订阅者条件表来存储所有不同的订阅频道。

希望对你有帮助。

参考资料:

http://sailsjs.org/documentation/reference/web-sockets/resourceful-pub-sub/subscribe

http://sailsjs.org/documentation/reference/web-sockets/resourceful-pub-sub/message

【讨论】:

  • 谢谢,这是一种创造性的解决方法。最后,我只使用了sails.sockets.join 和sails.sockets.broadcast...。我相信使用房间会更好,因为使用与模型关联的套接字有时会导致问题,因为模型创建/更新是异步的。无论如何,我在我的博客中写过这个:impacta.us/sails-with-socket-io-part-24
  • 在User.subscribe(subscriber, message, 'message'); 行中我在文档中找不到第三个参数(message),你能链接我或解释一下它的作用吗?谢谢@ZoltanSzabo
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 2018-08-20
  • 2017-11-29
相关资源
最近更新 更多