使用套接字保持 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 调用套接字到“选择”返回的对象上的事件

作为服务器端的结论:

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

(不过,如果您发现自己实现了一些手动控制器操作,sails API 可以轻松帮助您 publishing 和 subscribing)

客户处理

因此,对于 meteorsails,客户​​端只会收到他们应该收到的内容。现在是前端时间。

哲学 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,就像一个魅力。

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

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

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中的数据也比较冗余。未来计划一直是使用redislocal storage 进行设置...

...直到昨天我找到deepstream.io

这是一个完全满足我想要和需要的工具!不多也不少。

另一个值得一提的项目是meatier:“像流星,但更肉”。它由许多其他受到良好支持的开源项目组成,因此您甚至可以选择。

【讨论】:

以上是关于使用套接字保持 Sails.js 集合的客户端同步的主要内容,如果未能解决你的问题,请参考以下文章

Sails.js 对套接字请求的授权

ZeroMQ 和 Sails.js

如何在sails.js 中的SocketIO 握手期间修复“此套接字没有可用的有效会话”?

Sails.js 套接字 - 最佳实践 4/2014

将socket.io与sails js一起使用

Sails.js 一对多关系 - 变量所有者集合属性