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

我非常喜欢Meteor的pub / sub。 我想知道是否有一种方法来获得类似的工作stream,使用sails.js或一般的套接字库。

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

// 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) 

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

我非常喜欢Meteor的pub / sub。 我想知道是否有一种方法来获得类似的工作stream,使用sails.js或一般的套接字库

基本上是的 ,至less关于后端和前端之间的实时同步。 我们来回顾一下meteor的点滴答案。

酒吧/分

如Sabbir所述, Pub / Sub概念也由sails.js支持 。 虽然基本有些不同:

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

请注意,默认情况下:

  • meteor包含了自动发布软件包,只是通知每个客户端没有任何一种过滤。 为了获得一些过滤,你必须meteor remove autopublish那么你可以通过添加一个mongo请求来处理你的客户端会收到什么,就像这里解释的那样。
  • 在默认情况下,在其自动的“select”蓝图动作中, 自动将调用套接字订阅到由“select”返回的对象上的事件

作为服务器端的结论:

  • 订阅:只需调用findfindOne蓝图的默认动作,通过套接字(附加一些wherefilter或不),你的套接字将自动订阅每个事件有关返回的对象=>你不必编码任何东西在服务器上,在大多数情况下, Subscribe逻辑。
  • 发布:每个蓝图默认操作( createupdatedestroyaddremove )自动发布到订阅的套接字=>您不必在服务器上编写任何代码,在大多数情况下, Publish逻辑。

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

客户端处理

因此,无论是meteor还是风帆 ,客户只能得到他们应该得到的东西。 现在是前端的时间。

哲学

  • 一方面是meteor ,它的同构维度,确实提供了一个本质的前端连接器,暴露了它的数据绑定集合 。
  • 另一方面, sails前端不可知论的 ,可以被任何http REST连接器(JS或不),如$ http , $资源 ,或更高级的像Restangular的攻击 。
    虽然知道使用API​​的原始套接字的复杂性(涉及到会话,CORS,CSRF和其他东西),但他们开发了一个名为sails.io.js的javascript socket.io包装器,它被devise成REST-like-over-sockets,就像一个魅力。

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

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

官方的前端组件sails.io.js就不是那么高级的。 当涉及到Angular.js。

但是,您可以find一些社区连接器 ,其目标是提供与mongo数据绑定集合和对象相同的function。 有风帆资源 , 三angular帆或angular帆资源 。 我尝试了他们两个,我应该说我是失望的。 恕我直言,抽象程度如此之高,它只是变得烦人。 例如,对于RESTful友好的自定义操作(例如login很难适应您的需求

==>我会build议使用低级连接器,如angularSails或(我的首选)https://github.com/janpantel/angular-sails,或者甚至生sails.io.js,如果你不使用angular。

编辑:只是一个骨干版本 ,由帆的创造者

它只是工作得很好,相信我,“ 保持我的集合与该套接字同步 ”的代码是如此荒谬,find一个模块是不值得的

有些代码请停止说话

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

服务器

  • meteor

     # Server-side: App.publish('myCollection', -> collection.find({})) 
  •  //Nothing to do, just sails generate api myCollection 

客户

  • meteor

     # Client-side: myCollection = App.subscribe('myCollection') 
  • 帆,与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; }; }); 

    (我留下find地方, create你的想象力与[文档])

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

  • 那么,帆,只为angular,与帆资源

我不习惯这个过程,所以我留下你在这里或这里读,但我再次select手动.on()方法。

由于我问了这个问题,我学到了一些东西,一些新的项目已经出现了。 我决定不使用sails.io ,因为在使用React.js进行开发时,大部分社区的重量都落在了webpack ,但是sails.io使用了webpack sails.io 。 我意识到这些可以一起使用,甚至有一个NPM包,但我并不太热衷于使我的堆栈比过去更大,所以我去了一个简单的express.js服务器,我可以量身定制我的需求。

为了同步我的数据,我使用了rethinkdb ,它允许我asynchronous观察数据库的变化,然后通过websockets将变化发布到客户端。

  • 我已经build立了一个简单的脚本,在客户端和服务器上都保留了一个baobab树的实例。

  • 当树在服务器上被修改时,它通过websocket将事务数据发送到适当的客户端

  • 客户端将事务与树合并 。

该方法不利用local storage ,并将数据保存在node.js进程的内存中。 transaction的数据也相当多余。
未来的计划一直是使用redislocal storage

…直到昨天,当我发现deepstream.io

这是一个正是我想要和需要的工具! 没有什么比这更less的了。

另一个值得一提的项目更加有趣 :“像meteor,但更有趣”。 它由许多其他良好支持的开源项目组成,所以你甚至可以挑选。