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

标签 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 '嘿',但我没有得到任何模型事件,如创建或销毁记录!

蓝图被激活。我需要更改什么?

更新

这里还有一些代码,我想如何使用它:

$('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()了解更多信息。

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

更新

在最终审查有问题的代码之后,似乎有一些事情需要注意:

  1. 代码中监听的socket事件是Collection,但必须是collectionCollection 是模型的全局化 ID,而 collection 是它的 identity,用作事件名称。这里的案例很重要。
  2. 同样,/config/blueprints.js 中的autoWatch 设置区分大小写;你有它作为 autowatch
  3. 默认情况下,对于您自己触发的事件,您不会从蓝图中获得套接字通知。您可以改用套接字请求方法中的回调(即 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/

相关文章:

javascript - 我在哪里可以找到 JavaScript 的变更日志?

javascript - 我们何时使用 preventDefault 方法重要吗?

javascript - Nodejs,连接巴士男孩。上传几个文件

javascript - ES6 : Call instance functions by their names

javascript - Materialise 日期选择器不触发 ui

node.js - 为什么这个可调用的云函数失败并返回 "app":"MISSING"?

java - 在服务器套接字java中从客户端获取数据

c - TCP 套接字,服务器无法响应客户端,接受 : Interrupted system call

c - Linux套接字值

javascript - 将动态变量传递给 JavaScript