Sails pubsub如何订阅模型实例?

时间:2015-01-28 14:41:30

标签: sails.js publish-subscribe

我很难在我的客户端接收pubsub事件。客户端存储(回流)使用其id从项目获取数据。据我了解,这会自动为实时事件订阅Sails套接字(从版本0.10开始),但我不认为它发生了。

这是我的客户端商店从帆中获取数据 (这是ES6语法)

onLoadProject(id) {

 var url = '/api/projects/' + id;

 io.socket.get(url, (p, jwres) => {
   console.log('loaded project', id);
   this.project = p;
   this.trigger(p);
 });

 io.socket.on("project", function(event){
   console.log('realtime event', event);
 });
},

然后我在项目控制器中创建了一个测试“触摸”动作,只是为了更新modifiedAt字段。

touch: function(req, res){
   var id = req.param('id');

   Project.findOne(id)
  .then(function(project) {
    if (!project) throw new Error('No project with id ' + id);

    return Project.update({id: id}, {touched: project.touched+1});
  })
  .then(function(){
    // this should not be required right?
    return Project.publishUpdate(id);
  })
  .done(function() {
    sails.log('touched ok');
    res.ok();

  }, function(e) {
    sails.log("touch failed", e.message, e.stack);
    res.serverError(e.message);
  });
}

这不会在我的客户端代码中触发任何实时事件。我还添加了一个手册Project.publishUpdate(),但这不应该是正确的吗?

我错过了什么?

--------编辑----------

我的模型触摸属性的结果是复杂的,因为我将其设置为'number'而不是'integer',并且没有catch()部分的promise错误处理没有捕获到ORM异常。所以上面的代码工作,欢呼!但是每个Project实例都会收到实时事件。

所以让我重新解释一下我的问题:

如何将客户端套接字订阅到实例而不是模型?我可以检查客户端的id并检索更新的实例数据,但这似乎效率低下,因为每个客户端都收到有关每个项目的通知,即使他们只关心一个项目。

-----再次编辑------

所以没关系。我从每个实例获取更新的原因仅仅是因为在我的应用程序开始时我触发了一个findAll来获取可用项目的列表。结果我的套接字订阅了所有这些。解决方法是通过普通的http而不是套接字启动该调用,或使用单独的控制器操作来检索列表(因此绕过蓝图路由)。我选择了第二个选项,因为在我的情况下,在选择之前获取所有项目数据是愚蠢的。

1 个答案:

答案 0 :(得分:2)

所以回答我自己的问题。我从每个实例获取更新的原因仅仅是因为在我的应用程序开始时我触发了一个findAll来获取可用项目的列表。结果我的套接字订阅了所有这些。

解决方法是通过普通的http而不是套接字启动该调用,或者使用单独的控制器操作来检索列表(因此绕过蓝图路由)。我选择了第二个选项,因为在我的情况下,在选择一个之前获取所有资源数据是愚蠢的。

以下是我用来列出所有资源的功能,其中我过滤了与最初浏览列表无关的部分数据。

list: function(req, res) {

Project.find()
  .then(function(projects) {

    var keys = [
      'id',
      'name',
      'createdAt',
      'updatedAt',
      'author',
      'description',
    ];

    return projects.map(function(project){
      return _.pick(project, keys);
    });
  })
  .catch(function (e){
    res.serverError(e.message);
  })
  .done(function(list){
    res.json(list);
  }, function(e) {
    res.serverError(e.message);
  });

},

请注意,当用户加载资源(在我的情况下是项目)然后切换到另一个资源时,客户端将订阅这两个资源。我相信它需要一个动作请求,你明确取消订阅套接字以防止这种情况。在我的情况下,这不是一个问题,但我打算稍后解决。

我希望这对某人有帮助。