如何在sails.js 0.10中接收套接字事件?
我有一个名为Collection.js
的模型,它看起来像这样:
module.exports = { attributes: { title: { type: 'string', required: true }, description: { type: 'text', required: false }, sessions: { collection: 'session', via: 'collection' } } }
据我所知,这个消息是在创build新模型实例时通过套接字发送的,可以通过模型名称获得。
所以我已经在我的app.coffee
文件中进行了app.coffee
:
socket = io.connect() socket.on 'collection', -> console.log 'hey'
我已经validation了“环境”的作用,因为我得到了socket.on 'connect'. -> console.log 'hey'
通知socket.on 'connect'. -> console.log 'hey'
socket.on 'connect'. -> console.log 'hey'
,但我没有得到任何模型事件,如创build或破坏logging!
蓝图被激活。 我需要改变什么?
更新
这里有更多的代码,我想如何使用它:
$('document').ready -> noData = $('#list tr') socket.get '/collection', (res) -> createList(res)
所以,套接字应该订阅所有的事件。
后来我想钩住这个事件:
socket.on 'collection', (res) -> socket.get '/collection', (res) -> recreateList(res)
但从来没有通知。
更新2
我的控制器CollectionController.js
看起来像:
module.exports = { manage: function(req, res) { Collection.watch(req); return res.view(); } }
默认情况下,当您执行socket.get('/collection')
时,您将订阅find
蓝图所返回的所有实例,因此应在更新或销毁任何实例时通知您。 但是,除非您在Sails代码中显式调用Collection.watch(req)
,否则不会收到有关正在创build的logging的通知,或者b)在/config/blueprints.js
中将autoWatch
设置为true。 有关更多信息,请参阅.watch()和.subscribe()的参考 。
一般的想法是,对于可能有数千或数百万用户的大规模应用程序,每当创build新用户时向每个连接的套接字发送通知就没有任何意义。 套接字只应通知他们特定订阅的实例的变化。
更新
终于开始审查有问题的代码后,看起来有几件事情需要注意:
- 代码中正在监听的套接字事件是
Collection
,但它需要collection
。Collection
是模型的全球化ID,但collection
是其身份 ,用作事件名称。 案件事关重大。 - 同样,/
autoWatch
中的autoWatch
设置区分大小写; 你有它作为autowatch
。 - 默认情况下,您不会从蓝图中获取您自己触发的事件的套接字通知。 你可以使用套接字请求方法的callback(
socket.post(url, data, callback)
)。 这可以让你对自己触发的行为做出不同的反应,而不是别人触发的行动。 如果您真的想从蓝图中获取您自己的套接字通知,可以在/config/blueprints.js
设置mirror: true
。
它看起来像mirror
需要被添加到文档,虽然它主要是一个开发工具,你可能会后悔用于生产;)
一旦我改变了这三件事,代码运行良好!