使用套接字保持Sails.js集合的客户端同步

dem*_*mux 8 javascript node.js socket.io sails.js sails.io.js

我非常喜欢Meteor的pub/sub.我想知道是否有办法获得类似的工作流程,一般使用或只是一个套接字库.

特别是,我希望能够做的是:

// Server-side:
App.publish('myCollection', -> collection.find({}))

// Client-side:
let myCollection = App.subscribe('myCollection')
let bob = myCollection.find({name: 'Bob'})
myCollection.insert({name: 'Amelie'}, callback)
Run Code Online (Sandbox Code Playgroud)

与服务器的所有交互都应该在后台进行.

Cyr*_*PON 7

我非常喜欢Meteor的pub/sub.我想知道是否有办法获得类似的工作流程,一般使用sails.js或只是一个套接字库

基本上是的,至少关于后端和前端之间的实时同步.让我们回顾一下流星的含义并逐点回答.

酒吧/分

Sabbir所述的Pub/Sub概念也得到了sails.js的支持.虽然基础知识略有不同:

  • meteor中,客户端可以订阅他想要的一切,服务器通过只发布给他想要的人来控制收到的内容;
  • 而在sails.js中,服务器都订阅了一些客户端套接字发布到所有绑定套接字

请注意,默认情况下:

  • meteor包含autopublish包,它只通知每个客户端而不进行任何过滤.为了acheive一些过滤,你要meteor remove autopublish那么你可以处理什么将您的客户端加入了蒙戈请求它接收,如解释在这里.
  • 在默认情况下,在其自动"选择"蓝图行动,自动订阅呼叫插座上的"选择"返回的对象的事件.

作为服务器端的结论:

  • 订阅:只是通过套接字调用findfindOne蓝图默认操作(where无论是否附加一些过滤器),您的套接字将自动订阅有关返回对象的每个事件=>在大多数情况下,您不必在服务器上编写任何代码为Subscribe逻辑.
  • 发布:每一个蓝图默认动作(create,update,destroy,add,remove)自动发布到订阅插座=>您不必在服务器上,任何代码,在大多数情况下的Publish逻辑.

(但是,如果您发现自己实现了一些手动控制器操作,那么sails API可以帮助您轻松发布订阅)

客户处理

因此,对于流星风帆,客户只能收到他们应该收到的东西.现在是前端的时候了.

哲学
  • 流星一方面,它的同构维度,确实提供了一个前端连接器,暴露了它的数据绑定集合.
  • 在另一方面,是前端无关,并且可以通过任何HTTP REST连接器(JS或不)被攻击,如$ HTTP,$资源,或更高级的像Restangular.
    虽然,他们知道在API上使用原始套接字的复杂性(当谈到会话,CORS,CSRF和其他东西)时,他们开发了一个名为sails.io.js的javascript socket.io包装器,设计为REST-like-over-插座,就像一个魅力.

基本上,主要区别在于meteorsails高一级,因为它提供了同步集合和对象的逻辑.

与服务器的所有交互都应该在后台进行.

sails.io.js,官方的前端组件,并不是那么高级别.说到Angular.js.

但是,您可以找到一些社区连接器,旨在提供与mongo数据绑定集合和对象相同的功能.有帆资源,大三角帆角度资源帆.我试过他们两个,我应该说我很失望.抽象级别是如此之高,以至于它变得烦人,恕我直言.例如,对于非常非常友好的自定义操作(如a)login,根据您的需求调整它变得非常困难.

==>我建议使用低级连接器,例如angularSails或(我的首选)https://github.com/janpantel/angular-sails,如果你不使用,甚至是原始的sails.io.js角.

编辑:由帆的创造者创建一个骨干版本

它只是工作得很好,并且相信我," 保持我的集合与该套接字同步 "代码是如此荒谬,为此找到一个模块是不值得的.

有些代码请停止说话

特别是,我希望能够做的是:

服务器 客户
  • 流星

    # Client-side:
    myCollection = App.subscribe('myCollection')
    
    Run Code Online (Sandbox Code Playgroud)
  • 帆,sails.io.js(为方便起见,使用lodash)

    var myCollection;
    sails.io.get('/myCollection').then(
      function(res) {
        myCollection = res.data;
      },
      function(err) {
        //Handle error
      }
    );
    
    sails.io.on('myCollection').function(msg) {
      switch(msg.verb) {
        case 'created':
          myCollection.push(msg.data);
          break;
        case 'updated':
          _.extend(_.find(myCollection, 'id', msg.id), msg.data);
          break;
        case 'destroyed':
          _.remove(myCollection, 'id', msg.id);
          break;
      };
    });
    
    Run Code Online (Sandbox Code Playgroud)

    (我将[文档]留在那里findcreate你的想象中)

与服务器的所有交互都应该在后台进行.

  • 嗯,帆,只有角度,有帆的资源

我不习惯那个过程,所以我让你在这里这里读书,但我再一次选择手动.on()方法.