如何在sails.js 0.10中接收套接字事件?

时间:2014-04-20 10:34:13

标签: javascript node.js sockets sails.js

我有一个名为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)

但是从未收到通知。

更新2

我的控制器CollectionController.js看起来像是:

module.exports = {
    manage: function(req, res) {
        Collection.watch(req);
        return res.view();
    }
}

1 个答案:

答案 0 :(得分:6)

默认情况下,当您执行find时,您将订阅socket.get('/collection')蓝图返回的所有实例,以便在更新或销毁任何实例时通知您。但是,您不会收到有关创建的记录的通知,除非您a)在Sails代码中显式调用Collection.watch(req),或b)将autoWatch设置为true /config/blueprints.js。有关详细信息,请参阅reference for .watch().subscribe()

一般的想法是,对于可能拥有数千或数百万用户的大型应用程序,每当创建新用户时向每个连接的套接字发送通知都没有意义。只应通知套接字有关他们特别订阅的实例的更改。

<强>更新

在最终审查了相关代码之后,看起来有一些事情需要注意:

  1. 代码中正在侦听的套接字事件是Collection,但它必须是collectionCollection是模型的全球化ID,但collection身份,用作事件名称。案件在这里很重要。
  2. 同样,autoWatch中的/config/blueprints.js设置区分大小写;你有autowatch
  3. 默认情况下,您不会从蓝图中获取您自己触发的事件的套接字通知。您可以使用套接字请求方法中的回调(即socket.post(url, data, callback))。这允许您对自己触发的操作做出不同的响应,而不是由其他人触发的操作。如果您真的想从蓝图中获取自己的套接字通知,可以在mirror: true中设置/config/blueprints.js
  4. 看起来mirror需要添加到文档中,尽管它主要是您可能会后悔在生产中使用的开发工具;)

    一旦我改变了这三件事,代码工作正常!