使用 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.");
});
});
...
在我的 routes/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();
});
});
...
我正在使用 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.");
});
});
...
在我的 routes/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();
});
});
...