Sails pubsub 如何订阅模型实例?

Sails pubsub how to subscribe to a model instance?

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

这是我的客户商店从 sails 获取数据 (这是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);
 });
},

然后我在我的项目控制器中创建了一个测试 "touch" 操作,只是为了更新 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(),但这不是必需的吗?

我错过了什么?

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

我的模型 touched 属性导致了一个复杂的结果,因为我将它设置为 'number' 而不是 'integer' 并且 ORM 异常没有被 promise 错误处理捕获而没有捕获() 部分。所以上面的代码有效,欢呼!但是每个项目实例都会收到实时事件。

所以让我改一下我的问题:

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

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

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

所以回答我自己的问题。我从每个实例获取更新的原因很简单,因为在我的应用程序开始时,我触发了一个 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);
  });

},

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

希望对大家有所帮助。