【问题标题】:Sails.js: Subscribing a User to specific actions on a RequestSails.js:为用户订阅请求的特定操作
【发布时间】:2023-04-08 16:34:02
【问题描述】:

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

【问题讨论】:

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


    【解决方案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 放在本地并将其添加到视图模板中的某个位置,例如&lt;script&gt;var userId=&lt;%=user.id%&gt;&lt;/script&gt;.

    【讨论】:

    • 是的,你是对的,我取出了订阅,只是在客户端进行了 io.socket.get() 调用。但是,我现在意识到这不是我想要实现的行为。如果我在新页面中打开管理面板并批准请求模型的实例,则第一页会很好地创建警报。但是如果用户当时没有登录怎么办 - 我仍然希望能够在用户登录时显示通知。实现这一点的最佳方法是什么?
    • 这是一个完全不同的问题——实时消息传递与排队通知。对于后者,我建议从一个简单的Notification 模型开始,以保​​留无法实时传递的消息。或者做 Facebook 风格的,你总是保存通知,并使用实时更新一个标记,指示用户拥有的通知数量,只有在他们点击显示所有消息后才会清除。
    • 谢谢!那我会调查的:-)
    猜你喜欢
    • 2022-11-10
    • 2012-08-05
    • 2019-07-19
    • 2019-08-18
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多