使用套接字保持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”返回的对象上的事件 。
作为服务器端的结论:
- 订阅:只需调用
find
或findOne
蓝图的默认动作,通过套接字(附加一些where
filter或不),你的套接字将自动订阅每个事件有关返回的对象=>你不必编码任何东西在服务器上,在大多数情况下,Subscribe
逻辑。 - 发布:每个蓝图默认操作(
create
,update
,destroy
,add
,remove
)自动发布到订阅的套接字=>您不必在服务器上编写任何代码,在大多数情况下,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
的数据也相当多余。
未来的计划一直是使用redis
和local storage
…
…直到昨天,当我发现deepstream.io
!
这是一个正是我想要和需要的工具! 没有什么比这更less的了。
另一个值得一提的项目更加有趣 :“像meteor,但更有趣”。 它由许多其他良好支持的开源项目组成,所以你甚至可以挑选。