publishCreate - 未广播的消息

时间:2013-09-24 11:46:32

标签: sails.js

我坚持使用publishCreate消息广播并且不知道我做错了什么。

创建了一个名为Sample的简单模型:

module.exports = {
    attributes: {
        device: 'string',
        value: 'float'
    },

    afterCreate: function(sample, next) {
        console.log("afterCreate called");
        Sample.publishCreate({value: sample.value});
        console.log("publishCreate sent");
        next();
    }
};

在文档中没有找到模型是否自动发布publishCreate所以我添加了afterCreate。

然后我创建了以下视图:

<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="/styles/iphone.css">   
    <!-- Bring in the socket.io client -->
    <script type="text/javascript" src="/js/socket.io.js"></script>
    <!-- then beef it up with some convenience logic for talking to Sails.js -->
    <script type="text/javascript" src="/js/sails.io.js"></script>
    <!-- listen on socket.io for incoming messages -->
    <script type="text/javascript" src="/js/app.js"></script>
    <script type="text/javascript">
        socket.on('message', function(msg){
            alert('message received');
        });
    </script>
</head>
<body>
    <div class="block" style="height: 320px;">
        <div class="centered">
            <h1><%= temp %>°</h1>
        </div>
    </div>
</body>
</html>

理论上现在,如果我在浏览器中调用视图,然后在其他浏览器选项卡中调用

http://localhost:1337/sample/create?device=AA&value=10.0

在上面的视图中应该在客户端收到一条消息,但没有任何反应。

我从消息中知道套接字已连接,并且在创建新Sample时调用了publishCreate。

可能是什么原因?调用res.view()时,是否还需要在控制器中执行某些操作?

3 个答案:

答案 0 :(得分:2)

您是否在控制器的创建操作中明确声明了publishCreate?

'create': function(req,res,next){
  Sample.create(req.params.all(), function sampleCreated(err,sample){
    if(err){console.log(err); }
   Sample.publishCreate({
    id:sample.id,
    device: sample.device,
    value: sample.value
  });   
 });
},

您应该明确声明要发布的数据点。这里我设置了明确发布的Id,设备和值。蓝图和自动控制器映射很有用,但有时可能非常不稳定且不可靠,尤其是缺少文档。更好的具体。

答案 1 :(得分:2)

这里可能存在的问题是,正在运行包含subscribe调用的控制器操作以响应HTTP请求,套接字请求。当请求是通过HTTP时,req.socket没有意义;服务器不知道使用了什么套接字。为了使subscribe起作用,必须通过套接字连接进行请求,例如,使用socket.get库中的sails.io.js方法。

答案 2 :(得分:0)

我们需要使用Model.watch(req)才能订阅Model类。然后我们将收到publishCreate()广播。

http://sailsjs.org/documentation/reference/web-sockets/resourceful-pub-sub/watch