Sails.js: Abonnement d’un utilisateur à des actions spécifiques sur une demande

Dans mon projet Sails, j’ai un modèle / contrôleur utilisateur et un modèle / contrôleur de Request , ainsi qu’un contrôleur de Dashboard . Un utilisateur peut faire une demande de données à l’aide de RequestController.create et un administrateur peut l’approuver à l’aide de RequestController.grant .

Ce que je veux faire, c’est informer un utilisateur chaque fois qu’une de ses demandes est approuvée (mise à jour). Dans RequestController.grant , j’appelle Request.publishUpdate(...) , et dans mon DashboardController.display , j’appelle

 Request.find(req.session.user.id, function(err, requests) { ... Request.subscribe(req, requests, ['update']) ... }); 

Ensuite, dans la vue /dashboard/display , je mets dans les balises :

  // Socket handling for notifications io.socket.on("request", function(obj) { alert(obj.verb); alert(obj.data); alert(obj.previous); });  

Toutefois, lorsqu’il approuve la demande d’un utilisateur et s’affiche dans le tableau de bord, aucune alerte ne s’affiche. Le script pour sails.io est déjà chargé, sans erreur dans la console. Est-ce que je fais quelque chose de mal?

Le problème probable ici est que vous utilisez Request.subscribe dans un appel HTTP. Je suppose que c’est le cas puisqu’il semble que vous rencontrez des problèmes pour utiliser DashboardController.display pour afficher une vue. Dans ce cas, Request.subscribe ne fait rien du tout (il devrait vraiment afficher un avertissement) car il ne peut pas savoir à quel socket s’abonner!

Si vous souhaitez conserver la même logique logique de votre contrôleur (vous utilisez peut-être le tableau de requests tant que vue locale pour amorcer des données sur la page), c’est très bien; un refactor rapide serait de tester si c’est un appel de socket dans l’action:

 // 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}); } }); 

Ensuite, quelque part dans votre vue, appelez io.socket.get('/dashboard/display') pour vous abonner aux instances de request .

Vous pouvez également utiliser des modèles pour vous abonner aux demandes du io.socket.get('/request?user='+userId) frontal, en effectuant quelque chose comme io.socket.get('/request?user='+userId) , si vous mettez l’ID utilisateur dans les sections locales et l’ajoutez quelque part dans votre io.socket.get('/request?user='+userId) Voir le modèle, par exemple .