我有一个名为Collection.js
的模型,它看起来像这样:
module.exports = {
attributes: {
title: {
type: 'string',
required: true
},
description: {
type: 'text',
required: false
},
sessions: {
collection: 'session',
via: 'collection'
}
}
}
据我了解this文档,可以通过模型名称获得在创建新模型实例时通过套接字发送的消息。
所以我在我的app.coffee
文件中剪了这个:
socket = io.connect()
socket.on 'collection', ->
console.log 'hey'
我已经验证了“环境”的有效性,因为我收到了socket.on 'connect'. -> console.log 'hey'
的通知,但是我没有获得任何关于模拟事件,例如创建或存储记录! < / p>
蓝图已激活。我需要改变什么?
这里有更多代码,我想如何使用它:
$('document').ready ->
noData = $('#list tr')
socket.get '/collection', (res) ->
createList(res)
因此,套接字应该订阅所有事件。
后来我想挂钩这个事件:
socket.on 'collection', (res) ->
socket.get '/collection', (res) ->
recreateList(res)
但是从未收到通知。
我的控制器CollectionController.js
看起来像是:
module.exports = {
manage: function(req, res) {
Collection.watch(req);
return res.view();
}
}
答案 0 :(得分:6)
默认情况下,当您执行find
时,您将订阅socket.get('/collection')
蓝图返回的所有实例,以便在更新或销毁任何实例时通知您。但是,您不会收到有关创建的记录的通知,除非您a)在Sails代码中显式调用Collection.watch(req)
,或b)将autoWatch
设置为true /config/blueprints.js
。有关详细信息,请参阅reference for .watch()和.subscribe()。
一般的想法是,对于可能拥有数千或数百万用户的大型应用程序,每当创建新用户时向每个连接的套接字发送通知都没有意义。只应通知套接字有关他们特别订阅的实例的更改。
<强>更新强>
在最终审查了相关代码之后,看起来有一些事情需要注意:
Collection
,但它必须是collection
。 Collection
是模型的全球化ID,但collection
是身份,用作事件名称。案件在这里很重要。autoWatch
中的/config/blueprints.js
设置区分大小写;你有autowatch
。socket.post(url, data, callback)
)。这允许您对自己触发的操作做出不同的响应,而不是由其他人触发的操作。如果您真的想从蓝图中获取自己的套接字通知,可以在mirror: true
中设置/config/blueprints.js
。看起来mirror
需要添加到文档中,尽管它主要是您可能会后悔在生产中使用的开发工具;)
一旦我改变了这三件事,代码工作正常!