3

我坚持使用 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();
    }
};

如果模型自动发布创建,则在文档中没有找到,所以我添加了 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

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

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

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

4

3 回答 3

2

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

于 2014-02-13T00:06:27.453 回答
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、设备和值。蓝图和自动控制器映射很有用,但有时它可能确实不稳定且不可靠,尤其是在缺乏文档的情况下。最好具体一点。

于 2013-09-24T15:01:10.343 回答
0

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

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

于 2016-08-07T04:57:48.510 回答