Sails.js:订阅用户对请求的特定操作

时间:2014-08-10 21:47:12

标签: node.js socket.io messaging sails.js publish-subscribe

在我的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的脚本已加载,控制台中没有错误。难道我做错了什么?

1 个答案:

答案 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>