我坚持使用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()时,是否还需要在控制器中执行某些操作?
答案 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