使用套接字保持 Sails.js 集合的客户端同步
Posted
技术标签:
【中文标题】使用套接字保持 Sails.js 集合的客户端同步【英文标题】:Keeping a client-side sync of Sails.js collection, using sockets 【发布时间】:2015-07-04 10:33:13 【问题描述】:我非常喜欢 Meteor 的 pub/sub。我想知道是否有办法获得类似的工作流程,使用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)
与服务器的所有交互都应在后台进行。
【问题讨论】:
Sails.js 有resourceful pubsub 【参考方案1】:我非常喜欢 Meteor 的 pub/sub。我想知道是否有办法获得类似的工作流程,使用sails.js 或一般只是一个套接字库
基本上是的,至少关于后端和前端之间的实时同步。让我们回顾一下流星有什么并逐点回答。
发布/订阅
如 Sabbir 所述,Pub / Sub 概念也是supported by sails.js。虽然基础略有不同:
在 meteor 中,客户端可以订阅他想要的所有内容,而服务器通过只发布给他想要的人来控制接收的内容 ; 而在 sails.js 中,服务器会订阅一些客户端套接字并发布到所有绑定的套接字请注意,默认情况下:
meteor 包含 autopublish 包,它只是通知每个客户端,没有任何过滤。要实现一些过滤,您必须meteor remove autopublish
然后您可以通过向其添加 mongo 请求来处理您的客户端将收到的内容,就像 here 解释的那样。
sails 默认情况下,在其自动“选择”蓝图操作中,auto-subscribes 调用套接字到“选择”返回的对象上的事件。
作为服务器端的结论:
订阅:只需调用find
或findOne
蓝图默认操作,通过套接字(是否附加一些where
过滤器),您的套接字将自动订阅有关返回对象的每个事件=>您不大多数情况下,必须在服务器上为 Subscribe
逻辑编写任何代码。
发布:每个蓝图默认操作(create
、update
、destroy
、add
、remove
)自动发布到订阅的套接字 => 您不必在服务器上编写任何代码,在大多数情况下,对于Publish
逻辑。
(不过,如果您发现自己实现了一些手动控制器操作,sails API 可以轻松帮助您 publishing 和 subscribing)
客户处理
因此,对于 meteor 和 sails,客户端只会收到他们应该收到的内容。现在是前端时间。
哲学 meteor 一方面,它的同构维度确实提供了一个前端连接器,暴露了它的data-bound collections。 另一方面,sails 与 前端无关,可以被任何 http REST 连接器(JS 或非 JS)攻击,例如 $http、$resource ,或更高级的,例如Restangular。 虽然,他们意识到在他们的 API 上使用原始套接字的复杂性(当涉及到会话、CORS、CSRF 和其他东西时),他们开发了一个名为 sails.io.js 的 javascript socket.io 包装器,旨在成为 REST -like-over-socket,就像一个魅力。基本上,主要区别在于 meteor 比 sails 高一级,因为它提供了同步集合的逻辑和对象。
与服务器的所有交互都应在后台进行。
sails.io.js,官方的前端组件,只是不是那个高级别的。说到 Angular.js。
不过,您可以找到一些社区连接器,它们旨在提供与 mongo 数据绑定集合和对象相同的功能。有sails-resource、spinnaker 或angular resource sails。我都试过了,我应该说我很失望。抽象级别是如此之高,以至于它变得烦人,恕我直言。例如,对于不太适合 RESTful 的自定义操作,例如 login
,很难根据您的需要进行调整。
==> 我建议使用低级连接器,例如angularSails 或(我更喜欢)https://github.com/janpantel/angular-sails,或者如果是原始sails.io.js你没有使用 Angular。
编辑:刚刚找到 backbone version,作者是风帆的创造者
效果很好,相信我,“让我的收藏与那个套接字保持同步”代码太荒谬了,为此找到一个模块不值得。
请给一些代码,不要再说了
服务器特别是,我希望能够做的事情是:
流星
# Server-side:
App.publish('myCollection', -> collection.find())
帆
//Nothing to do, just sails generate api myCollection
客户
流星
# 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
where 和 create
留给您与 [文档] 一起想象)
好吧,Sails,仅适用于 Angular,带有风帆资源与服务器的所有交互都应在后台进行。
我不太习惯这个过程,所以我让你阅读here 或here,但我还是会选择手动.on()
方法。
【讨论】:
此外,请注意,meteor 的同构集合和对象,除了被称为“3 方式数据绑定”之外,还实现了“离线同步”的概念。将数据保存在本地 mini-mongo 的缓存中,并在网络可用时与主 mongo 同步(和合并)它。这被称为“4 种方式数据绑定”,我只是找不到任何可靠的过程来使用sails.js 自动执行此操作 你能回答这个问题吗? ***.com/questions/45431466/… 不抱歉,我很久以前就离开了sails.js.. =)【参考方案2】:自从我提出这个问题以来,我学到了一些东西,并且出现了一些新项目。我决定不使用sails.io
,因为在使用React.js
开发时,社区的大部分权重都在webpack
后面,但sails.io
使用gulp
。我意识到这些可以一起使用,甚至还有一个 npm 包,但我不太热衷于让我的堆栈比它必须的更大,所以我选择了一个简单的 express.js
服务器,我可以定制我的需求。
为了同步我的数据,我使用rethinkdb
,它允许我异步监视数据库的更改,然后通过websockets
将更改发布到客户端。
我设置了一个简单的脚本,在其中我在客户端和服务器上都保留了一个 baobab
树的实例。
当树在服务器上被修改时,它会通过websocket
向相应的客户端发送transaction data
客户端merges与树的事务。
此方法不使用local storage
,并将数据保存在node.js
进程的内存中。 transaction
中的数据也比较冗余。未来计划一直是使用redis
和local storage
进行设置...
...直到昨天我找到deepstream.io
!
这是一个完全满足我想要和需要的工具!不多也不少。
另一个值得一提的项目是meatier:“像流星,但更肉”。它由许多其他受到良好支持的开源项目组成,因此您甚至可以选择。
【讨论】:
以上是关于使用套接字保持 Sails.js 集合的客户端同步的主要内容,如果未能解决你的问题,请参考以下文章