8

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

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

4

2 回答 2

7

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

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

发布/订阅

如Sabbir 所述, Pub/Sub概念也得到了sails.js的支持。虽然基础略有不同:

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

请注意,默认情况下:

  • 流星包含自动发布包,它只通知每个客户端而没有任何过滤。为了实现一些过滤,您必须meteor remove autopublish然后通过向其添加 mongo 请求来处理您的客户端将收到的内容,就像在此处解释的那样。
  • 默认情况下, sails在其自动“选择”蓝图操作中,自动订阅调用套接字到“选择”返回的对象上的事件

作为服务器端的结论:

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

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

客户处理

因此,对于流星,客户只收到他们应该收到的东西。现在是前端的时间。

哲学
  • 一方面, meteor的同构维度确实提供了一个前端连接器,暴露了它的数据绑定集合
  • 另一方面,sails与前端无关,并且可以被任何 http REST 连接器(无论是否为 JS)攻击,例如$http$resource或更高级的连接器,例如Restangular
    虽然,他们意识到在他们的 API 上使用原始套接字的复杂性(当涉及到会话、CORS、CSRF 和其他东西时),他们开发了一个名为sails.io.js的javascript socket.io 包装器,旨在类似于REST。插座,就像一个魅力。

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

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

官方前端组件sails.io.js并没有那么高级。谈到 Angular.js。

不过,您可以找到一些旨在提供与 mongo 数据绑定集合和对象相同的功能的社区连接器。风帆资源三角帆角资源风帆。我都试过了,我应该说我很失望。抽象级别是如此之高,以至于它变得烦人,恕我直言。例如,使用对 RESTful 不太友好的自定义操作(例如 a login),很难根据您的需要对其进行调整

==> 我建议使用低级连接器,例如angularSails或(我的首选)https://github.com/janpantel/angular-sails,如果您不使用,甚至可以使用原始sails.io.js角。

编辑:刚刚找到了一个骨干版本,由风帆的创造者

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

请给一些代码,别说了

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

服务器
  • 流星

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

    # Client-side:
    myCollection = App.subscribe('myCollection')
    
  • Sails,带有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你的想象留给[文档])

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

  • 好吧,Sails,仅适用于 Angular,带有风帆资源

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

于 2015-05-07T11:59:06.160 回答
1

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

为了同步我的数据,我使用rethinkdb它允许我异步观察数据库的更改,然后通过websockets.

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

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

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

这种方法在进程中不使用local storage和保留内存中的数据node.js。中的数据transaction也相当冗余。未来
的计划一直是使用和设置一些东西......redislocal storage

……直到昨天我才发现deepstream.io

这是一个工具,正是我想要和需要的!不多也不少。

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

于 2016-03-04T16:02:14.277 回答