繁体   English   中英

使用Redis pubsub和socket.io的关注者状态更新通知

[英]Followers status update notification using redis pubsub and socket.io

我正在使用node.js Express创建一个应用程序。 今天,我尝试实现redis pubsub来向关注者发送通知。

当用户登录时,我检索他的恶魔_id列表并订阅这些_id作为频道名。 当任何用户更新其状态时,他们都会向其频道发布通知。 在我看来,它应该没有任何问题。

但是对于每个用户,redis客户端都是相同的。 因此,如果一个用户订阅了他的朋友_id,那么所有用户都会在该频道上收到有关消息的通知。

我做了什么

在我的app.js文件中-

...
// Because I wanted to publish from express route , so global
var redis = require('redis');
global.pub = redis.createClient();
global.sub = redis.createClient();
...

...
io.on('connection', function(socket){
  console.log(io.engine.clientsCount + " client connected.");
  global.socket = socket;

  sub.on("message", function(channel, message){
    console.log("Message "+ message + " on channel " + channel+ " arived");
    socket.emit('notification', {data: message});
  });

  socket.on('disconnect', function(){
    console.log(io.engine.clientsCount + " client after disconnecct.");
  });

});

...

在我的路线/ user.js文件上

...
router.post('/login', function(req, res, next){
...
...
    Friendship.find({user2: req.session.userid}, function(err, doc){
        if (err) return console.dir(err);


        // req.session.followers = _.pluck(doc, 'user1');
        // console.log(req.session);

        /**
         * 
         */
        var userlist = _.pluck(doc, 'user1');
        console.dir(userlist);

        if(userlist.length != 0 ) {
            sub.subscribe(userlist);
        }

        res.redirect('/'); 
    });

和示例发布到频道-

....
router.post('/progress', function(req, res, next){
    ....
    ....
    myPorgress.save(function(err){
        if(err) console.dir(err);

        pub.publish(req.myAuth.userid, myPorgress);
        res.json({message: "Book progress update successful"});
    });
    ....
});
....

如何为不同用户创建Redis子客户端的不同客户端实例? 还是有其他方法可以完成相同的工作?

TL; DR

如何在Node JS Express中实现Facebook风格的好友通知? 我可以使用Redis PubSub吗? 如果可以的话

我只是通过使用express-socket.io-session解决了我的问题。 当用户登录时,我将他的关注者列表保存在会话对象中。

所以我的user.js文件变成

...

var userlist = _.pluck(doc, 'user1');
    req.session.followers = userlist;
    console.dir(userlist);
    res.redirect('/'); 
...

和我的app.js文件

...

io.use(sharedsession(session, {
    autoSave:true
})); 

io.on('connection', function(socket){
  console.log(io.engine.clientsCount + " client connected.");

  //subscribe to friends updates
  var sub = redis.createClient();

  if(socket.handshake.session.followers){
    console.log("subscribing.. to " + socket.handshake.session.followers);
    sub.subscribe(socket.handshake.session.followers);
  }

  sub.on("message", function(channel, message){
    console.log("Message "+ message + " on channel " + channel+ " arived");
    socket.emit('notification', {data: message});
  });

  socket.on('disconnect', function(){
    console.log(io.engine.clientsCount + " client after disconnecct.");
    sub.quit();
  });

});

...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM