我需要一些关于如何在我的node.js应用中为多个用户使用rethinkDb的更改源的建议。
基本上我想要当用户登录我们的Web应用程序时,我想为该特定用户设置更改源,以监视由用户组织筛选的特定表的更改。
我在想,当用户连接时,他们也会通过socketio连接,我可以在连接时为用户分配更改源。然后在断开连接时关闭用户光标。
可能是这样的:
io.on('connection', (socket)=> {
//Assume user information is in socket.user
r.db('database').table('entries').filter({organization: socket.user.organization}).changes().run(conn, (err, cursor){
cursor_holder[socket.user.id] = cursor //Maybe hold the cursors in memory while the user is connected?
cursor.each((err, entry)=>{
socket.emit('update', entry);
})
})
socket.on('disconnect', ()=>{
cursor_holder[socket.user.id].close() //I dont know what the exact close method is for the feed.
})
}
请原谅代码中的任何错误,但这是我必须处理我的最终目标的最初想法。
我很好奇你有什么建议可以如何正确处理我之前说过的最终目标。
提前感谢大家的时间和建议。非常感谢。
答案 0 :(得分:0)
我也在寻找一些关于此的提示。我看到了另一种方法 - 使用您的数据订阅表以进行更改,然后让您的代码使用一些新数据更新特定用户。
如果为每个用户创建一个新的更改源,我恐怕最终会有大量的同时更改。不确定有多少可以同时运行。 如果用户通过简单地关闭浏览器注销会发生什么?我相信,改变饲料将继续运行。数据库将充满非封闭的更改源,并且永远不会得到用户不再对接收更改感兴趣的反馈。
答案 1 :(得分:0)
您可以使用它在rethinkdb中查询以检测任何更改,并记住它只适用于rethinkdb上下文希望这会提供一些帮助
yield r.table('Us').filter(function (S) {
return S //your rethinkdb query
})
.changes().merge(function () {
return {
total: r.table('Us').filter(function (x) {
return x //your rethinkdb query
}).count(),
};
})
答案 2 :(得分:0)
如果所有用户都订阅了相同的更改源,并且您不需要将includeInitial设置为true,则只能为服务器创建一个更改源(与每个服务器连接相反)并推送更改源到socket.io房间,然后将用户添加到连接房间。这样做的好处是可以在重新思考集群中保留cpu资源
服务器端:
var io = require('socket.io')(httpApp, {options});
r.table('cats')
.filter({location : 'kitchen'})
.changes({includeTypes : true})
.run(rethinkConnection, function(err, cursor) {
if (err) {
// error handling
} else {
cursor.each(function(err, row) {
if (err) {
// error handling
} else {
io.to('kitcatFeed').emit('kitcatChange', row);
}
});
}
});
io.on('connection', function(socket) {
socket.join('kitcatFeed');
});