使用套接字保持 Sails.js 集合的客户端同步
Keeping a client-side sync of Sails.js collection, using sockets
我很喜欢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)
与服务器的所有交互都应在后台进行。
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结论:
- 订阅:只需调用
find
或 findOne
蓝图默认操作,通过套接字(附加一些 where
过滤器或不附加),您的套接字将自动订阅有关的每个事件返回 objects => 在大多数情况下,您不必在服务器上为 Subscribe
逻辑编写任何代码。
- 发布:每个蓝图默认操作(
create
、update
、destroy
、add
、remove
)auto-publish 到订阅的套接字=> 在大多数情况下,您不必在服务器上为 Publish
逻辑编写任何代码。
(不过,如果您发现自己正在执行一些手动控制器操作,sails API 可以帮助您轻松 publishing and subscribing)
客户处理
因此,对于 meteor 和 sails,客户只会收到他们应该收到的东西。现在是 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,就像一个魅力。
基本上,主要区别在于 meteor 比 sails 更进一步 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;
};
});
(我将 find
和 create
留给您与 [文档] 一起想象)
All interaction with the server should happen in the background.
- 好吧,Sails,仅供 angular,有 sails 资源
自从我提出这个问题后,我学到了一些东西,并且出现了一些新项目。我决定反对sails.io
,因为在用React.js
开发时,社区的大部分权重都落后于webpack
,但是sails.io
使用gulp
。我意识到这些可以一起使用,甚至有一个 npm 包,但我不太热衷于让我的堆栈比它必须的更大,所以我选择了一个简单的 express.js
服务器,我可以适合我的需要。
为了同步我的数据,我使用了 rethinkdb
,它允许我异步观察数据库的变化,然后通过 websockets
.[=30= 将变化发布到客户端]
我设置了一个简单的脚本,我在客户端和服务器上都保留了一个 baobab
树的实例。
当树在服务器上被修改时,它通过 websocket
发送 transaction data 到适当的客户端
客户端merges与树的交易
该方法不使用local storage
,而是在node.js
进程中将数据保存在内存中。 transaction
里面的数据也比较冗余
未来的计划 一直是使用 redis
和 local storage
...
进行设置
...直到昨天我发现 deepstream.io
!
这个工具完全可以满足我的需求!不多也不少。
另一个值得一提的项目是meatier:"like meteor, but meatier"。它由许多其他得到良好支持的开源项目组成,因此您甚至可以挑选。
我很喜欢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)
与服务器的所有交互都应在后台进行。
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结论:
- 订阅:只需调用
find
或findOne
蓝图默认操作,通过套接字(附加一些where
过滤器或不附加),您的套接字将自动订阅有关的每个事件返回 objects => 在大多数情况下,您不必在服务器上为Subscribe
逻辑编写任何代码。 - 发布:每个蓝图默认操作(
create
、update
、destroy
、add
、remove
)auto-publish 到订阅的套接字=> 在大多数情况下,您不必在服务器上为Publish
逻辑编写任何代码。
(不过,如果您发现自己正在执行一些手动控制器操作,sails API 可以帮助您轻松 publishing and subscribing)
客户处理
因此,对于 meteor 和 sails,客户只会收到他们应该收到的东西。现在是 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,就像一个魅力。
基本上,主要区别在于 meteor 比 sails 更进一步 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; }; });
(我将
find
和create
留给您与 [文档] 一起想象)
All interaction with the server should happen in the background.
- 好吧,Sails,仅供 angular,有 sails 资源
自从我提出这个问题后,我学到了一些东西,并且出现了一些新项目。我决定反对sails.io
,因为在用React.js
开发时,社区的大部分权重都落后于webpack
,但是sails.io
使用gulp
。我意识到这些可以一起使用,甚至有一个 npm 包,但我不太热衷于让我的堆栈比它必须的更大,所以我选择了一个简单的 express.js
服务器,我可以适合我的需要。
为了同步我的数据,我使用了 rethinkdb
,它允许我异步观察数据库的变化,然后通过 websockets
.[=30= 将变化发布到客户端]
我设置了一个简单的脚本,我在客户端和服务器上都保留了一个
baobab
树的实例。当树在服务器上被修改时,它通过
websocket
发送 transaction data 到适当的客户端
客户端merges与树的交易
该方法不使用local storage
,而是在node.js
进程中将数据保存在内存中。 transaction
里面的数据也比较冗余
未来的计划 一直是使用 redis
和 local storage
...
...直到昨天我发现 deepstream.io
!
这个工具完全可以满足我的需求!不多也不少。
另一个值得一提的项目是meatier:"like meteor, but meatier"。它由许多其他得到良好支持的开源项目组成,因此您甚至可以挑选。