我非常喜欢 Meteor 的 pub/sub。我想知道是否有办法获得类似的工作流程,使用sails.js 或一般只是一个套接字库
基本上是的,至少关于后端和前端之间的实时同步。让我们回顾一下流星有什么并逐点回答。
发布/订阅
如Sabbir 所述, Pub/Sub概念也得到了sails.js的支持。虽然基础略有不同:
- 在meteor中,客户端可以订阅他想要的一切,而服务器通过只发布给他想要的人来控制它接收的内容;
- 而在sails.js中,服务器确实订阅了一些客户端套接字并发布到所有绑定的套接字
请注意,默认情况下:
- 流星包含自动发布包,它只通知每个客户端而没有任何过滤。为了实现一些过滤,您必须
meteor remove autopublish
然后通过向其添加 mongo 请求来处理您的客户端将收到的内容,就像在此处解释的那样。
- 默认情况下, sails在其自动“选择”蓝图操作中,自动订阅调用套接字到“选择”返回的对象上的事件。
作为服务器端的结论:
- 订阅:只需通过套接字调用
find
或findOne
蓝图默认操作(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()
方法。