我有一个名为 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 '嘿'
,但我没有得到任何模型事件,如创建或销毁记录!
蓝图被激活。我需要更改什么?
更新
这里还有一些代码,我想如何使用它:
$('document').ready ->
noData = $('#list tr')
socket.get '/collection', (res) ->
createList(res)
因此,套接字应该订阅所有事件。
稍后我想 Hook 这个事件:
socket.on 'collection', (res) ->
socket.get '/collection', (res) ->
recreateList(res)
但永远不会收到通知。
更新2
我的 Controller CollectionController.js
看起来像:
module.exports = {
manage: function(req, res) {
Collection.watch(req);
return res.view();
}
}
最佳答案
默认情况下,当您执行 socket.get('/collection')
时,您将订阅 find
蓝图返回的所有实例,因此您应该当它们中的任何一个被更新或销毁时得到通知。但是,除非您 a) 在 Sails 代码中显式调用 Collection.watch(req)
,或者 b) 设置 autoWatch
在 /config/blueprints.js
中设置为 true。查看reference for .watch()和 .subscribe()了解更多信息。
一般的想法是,对于可能拥有数千或数百万用户的大型应用程序,每当创建新用户时向每个连接的套接字发送通知是没有意义的。套接字只应收到有关它们专门订阅的实例发生更改的通知。
更新
在最终审查有问题的代码之后,似乎有一些事情需要注意:
- 代码中监听的socket事件是
Collection
,但必须是collection
。Collection
是模型的全局化 ID,而collection
是它的 identity,用作事件名称。这里的案例很重要。 - 同样,
/config/blueprints.js
中的autoWatch
设置区分大小写;你有它作为autowatch
。 - 默认情况下,对于您自己触发的事件,您不会从蓝图中获得套接字通知。您可以改用套接字请求方法中的回调(即
socket.post(url, data, callback)
)。这使您可以对自己触发的 Action 做出不同的 react ,而不是对其他人触发的 Action 使用react。如果你真的想从蓝图中获取自己的套接字通知,你可以在/config/blueprints.js
中设置mirror: true
。
看起来 mirror
需要添加到文档中,尽管它主要是一个您可能会后悔在生产中使用的开发工具;)
一旦我改变了这三件事,代码就可以正常工作了!
关于javascript - 如何在 sails.js 0.10 中接收套接字事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23181075/