在我的Sails项目中,我有一个User
模型/控制器和一个Request
模型/控制器,以及一个Dashboard
控制器。用户可以使用RequestController.create
发出数据请求,管理员可以使用RequestController.grant
批准该数据。
我想要做的是在他/她的一个请求被批准(更新)时通知用户。在RequestController.grant
,我致电Request.publishUpdate(...)
,在我的DashboardController.display
,我致电
Request.find(req.session.user.id, function(err, requests) {
...
Request.subscribe(req, requests, ['update'])
...
});
然后,在视图/dashboard/display
中,我输入了<script>
标签:
<script>
// Socket handling for notifications
io.socket.on("request", function(obj) {
alert(obj.verb);
alert(obj.data);
alert(obj.previous);
});
</script>
但是,在批准用户的请求并转到仪表板后,不会显示任何警报。 sails.io的脚本已加载,控制台中没有错误。难道我做错了什么?
答案 0 :(得分:1)
这里可能存在的问题是您在HTTP调用中使用Request.subscribe
。我假设情况就是这样,因为使用DashboardController.display
来显示视图似乎是个问题。在这种情况下,Request.subscribe
根本不做任何事情(它应该显示警告),因为它不可能知道要订阅哪个套接字!
如果您想保持控制器逻辑相同(您可能使用requests
数组作为本地视图来引导页面上的某些数据),那很好;快速重构将测试它是否在动作中调用套接字:
// Also note the criteria for the `find` query below--just sending an
// ID won't work for .find()!
Request.find({user: req.session.user.id}, function(err, requests) {
...
// If it's a socket request, subscribe and return success
if (req.isSocket) {
Request.subscribe(req, requests, ['update'])
return res.send(200);
}
// Otherwise continue on displaying the view
else {
...
return res.view('dashboard', {requests: requests});
}
});
然后在您的视图中的某个位置调用io.socket.get('/dashboard/display')
订阅request
个实例。
您还可以使用蓝图订阅来自前端的请求,执行io.socket.get('/request?user='+userId)
之类的操作,如果您将用户ID放在本地中并将其添加到视图模板中的某个位置,例如<script>var userId=<%=user.id%></script>
。