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

Keeping a client-side sync of Sails.js collection, using sockets

我很喜欢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)

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

I very much like Meteor's pub/sub. I wonder if there is a way to get a similar workflow, using sails.js or just a socket library in general

基本上,至少是后端和前端之间的实时同步。让我们回顾一下流星有什么,逐点回答。

Pub/sub

Pub / Sub concept, as stated by Sabbir, is also supported by sails.js。尽管基础略有不同:

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

请注意,默认情况下:

  • meteor 包含 autopublish 包,它只是 通知每个客户端 而无需任何类型的过滤.为了实现一些过滤,你必须 meteor remove autopublish 然后你可以通过向它添加 mongo 请求来处理你的客户端将收到的内容,如解释的 here.
  • sails 默认情况下,在其自动 "select" 蓝图操作上,auto-subscribes 调用套接字到 objects 由 "select".
  • 返回

作为server-side结论:

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

(不过,如果您发现自己正在执行一些手动控制器操作,sails API 可以帮助您轻松 publishing and subscribing)

客户处理

因此,对于 meteorsails,客户只会收到他们应该收到的东西。现在是 front-end 的时间。

哲学
  • meteor 一方面,它的同构维度确实提供了一个 front-end 连接器,暴露了它的 data-bound collections.
  • 另一方面,
  • sails front-end 不可知,并且可以被任何 http REST 连接器(JS或不),例如 $http, $resource, or more advanced ones like Restangular.
    虽然,意识到在 API 上使用原始套接字的复杂性(当涉及到 session、CORS、CSRF 和其他东西时),他们开发了 javascript socket.io 包装器称为 sails.io.js 设计为 REST-like-over-socket,就像一个魅力。

基本上,主要区别在于 meteorsails 更进一步 higher-level,因为它提供了以下逻辑正在同步 collections 和 objects.

All interaction with the server should happen in the background.

sails.io.js,官方 front-end 组件,不是 that high-level。说到Angular.js.

不过,您可以找到一些 社区连接器 旨在提供与 mongo data-bound collections 相同的功能和 objects。有sails-resource, spinnaker or angular resource sails。我尝试了他们两个,我应该说我很失望。抽象级别如此之高以至于它变得烦人,恕我直言。例如,使用 not-very-RESTful-friendly 自定义操作,如 login很难根据您的需要进行调整

==> 我建议使用 low-level 连接器,例如 angularSails 或(我的首选)https://github.com/janpantel/angular-sails,或如果您不使用 Angular.

,甚至是原始的 sails.io.js

编辑:刚找到 backbone version,由风帆的创造者

它工作得很好,相信我,“让我的 collection 与那个套接字保持同步 ”代码太荒谬了,为此找到一个模块不值得

请输入代码,别说了

In particular, what I would like to be able to do is something along the lines of:

服务器
  • 流星

    # 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;
      };
    });
    

    (我将 findcreate 留给您与 [文档] 一起想象)

All interaction with the server should happen in the background.

  • 好吧,Sails,仅供 angular,有 sails 资源

我不太习惯这个过程,所以我让你继续阅读 here or here,但我还是会选择手动 .on() 方法。

自从我提出这个问题后,我学到了一些东西,并且出现了一些新项目。我决定反对sails.io,因为在用React.js开发时,社区的大部分权重都落后于webpack,但是sails.io使用gulp。我意识到这些可以一起使用,甚至有一个 npm 包,但我不太热衷于让我的堆栈比它必须的更大,所以我选择了一个简单的 express.js 服务器,我可以适合我的需要。

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

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

  • 当树在服务器上被修改时,它通过 websocket

  • 发送 transaction data 到适当的客户端
  • 客户端merges与树的交易

该方法不使用local storage,而是在node.js进程中将数据保存在内存中。 transaction里面的数据也比较冗余
未来的计划 一直是使用 redislocal storage ...

进行设置

...直到昨天我发现 deepstream.io!

这个工具完全可以满足我的需求!不多也不少。

另一个值得一提的项目是meatier:"like meteor, but meatier"。它由许多其他得到良好支持的开源项目组成,因此您甚至可以挑选。