[英]How to live stream mongodb data to front end with nodejs/mongodb/socketio?
我正在尝试构建一个实时的仪表板,该仪表板将数据从mongodb限制的集合流传输到登录的任何用户的前端。后端将是python或类似版本,并将不断用新数据更新用户集合。 我正在使用passportjs进行身份验证,并使用passport-socketio-redis集成socketio。
我相信的第一个目标是将用户名作为值添加到socketio客户端列表中。
示例:连接了一个客户端,客户端列表为:['wukBbRD3vcXCuqylAAAA']。
添加用户值,现在客户端列表如下:[{'wukBbRD3vcXCuqylAAAA':username}]
之后,我将定期(每1秒左右)遍历客户端列表,并为每个客户端启动mongodb流。 然后,我将使用其套接字ID将结果数据流式传输到该客户端。 (我假设断开连接后,客户端key:val对将被删除,可能必须添加其他代码以杀死mongodb流。)
我想出了下面的代码,由于我目前仍想找出如何将用户名与socketio客户端ID配对,因此无法正确完成上述操作。
这甚至是构建实时仪表板的好方法吗? 我越了解这一点,似乎就越不可能。 感谢你的帮助!
/ bin / www
var app = require('../app');
var debug = require('debug')('project:server');
var http = require('http');
//misc server initialization stuff left out to save space. this file calls in sockets.js below
var io = require('socket.io').listen(server);
require('../sockets')(io);
sockets.js
var passport = require('passport');
var cookieParser = require('cookie-parser');
var redis = require('redis').createClient();
var session = require('express-session');
var RedisStore = require('connect-redis')(session);
var socketioRedis = require("passport-socketio-redis");
var History = require('./models/history');
var clientinfo;
var user_name;
module.exports = function (io) {
io.use(socketioRedis.authorize({
passport:passport,
cookieParser: cookieParser,
key: 'express.sid',
secret: 'keyboard cat',
store: new RedisStore({ host: 'localhost', port: 6379, client: redis }),
success: authorizeSuccess, //callback on success
fail: authorizeFail //callback on fail/error
}));
function authorizeSuccess(data, accept){
//get the username
user_name = data.user.id;
accept();
}
function authorizeFail(data, message, error, accept)
{
if(error)
accept(new Error(message));
}
io.on('connection', function(socket){
//get list of clients - I believe I need to somehow add the username to the client list here.
clientinfo = Object.keys(io.engine.clients)
});
setInterval(function(){
for (key in clientdict) {
//start new stream for each client (not 100% sure multiple streams can exist)
streamData (key, clientdict[key])
}
}
},1000);
//create mongodb stream and emit to client
function streamData (u_id, sockvar) {
var stream = History.find({ user_id: u_id}, {'_id':0, 'test':1}).tailable(true).stream();
stream.on('data', function (doc) {
io.to(sockvar).emit('dash_data', { dash_data: doc });
});
}
}
可能已经解决了-应该更好地阅读文档。 事实证明,passport-socketio-redis允许您访问“ socket.request.user”,该返回有关用户的信息。 有关新连接/断开连接时创建和删除key:value对的信息,请参见下面的代码
io.on('connection', function(socket){
clientdict[socket.request.user.id] = socket.id;
//console.log(socket.request.user)
//all clients console.log(Object.keys(io.engine.clients))
console.log(clientdict)
socket.on('disconnect', function(){
delete clientdict[socket.request.user.id]
console.log('removed')
console.log(socket.request.user.id)
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.