快速会话:第一个用户会话被第二个用户会话覆盖
Express-session: first user session overwritten by second user session
这是将用户传递给视图的获取请求
app.get('/blog/:id', function(req, res) {
// Define which page
res.render('blog', {
user: req.user,
});
});
这是一个文本区域,该页面上的所有用户都应该存储他们的名字。
<textarea readonly id="usersInRoom" placeholder="<%= user.username %>"></textarea>
这成功地将正确的用户名设置为占位符。如果第二个用户呈现相同的视图并与第一个用户同时访问此页面,则第二个用户的用户名将是唯一的占位符。如何存储第一个用户名,以便当第二个用户打开页面时,占位符可以是第一个用户名 + 第二个用户名的串联?第一个用户存储在任何嵌入式 javascript 数组等中的数据对第二个用户不可用。
如果您使用的是 SignalR,那么您可以将当前用户列表广播到每个连接并像 sample chat application 中那样更新视图。
如果您使用的是常规 ajax 服务器轮询,请设置客户端方法以从数据库存储中获取当前页面用户列表的时间间隔。由于 http 缺少状态,如果有一段时间未发帖,您将不得不 'retire' 列表中的用户。
客户代码:
setInterval(checkServer,5000);
function checkServer(){
//some ajax call to the server here
//that returns your user list
...
success:function(result){
$('#usersInRoom').val(result);
}
}
服务器代码(假设您将所有当前页面用户保存在 table
带有一个名为 LastModified 的字段):
CurrentPageUser class(将其作为 CurrentPageUsers table 存储在您的 DbContext 中):
public class CurrentPageUser{
public int Id {get;set;}
public DateTime LastModified {get;set;}
public string Name {get;set;}
}
控制器方法:
public string GetCurrentUsers(int selfid){
using (var db=new DbContext()){
var now=DateTime.Now;
//update your requesting user so other users can see him/her
db.CurrentPageUsers.Find(selfid).LastModified=now;
db.SaveChanges();
DateTime timelimit = now.AddMinutes-5);
return string.Join(", ",
db.CurrentPageUsers.Where(u=>
u.LastModified<timelimit).Select(u=>u.Name).ToList());
}
}
请注意,SignalR 实现具有更好的性能,并且在服务器端实现起来不那么笨拙,不需要数据库 table 来存储当前页面用户。它就是为这种场景而制作的。
我找到了解决办法。事实上,我确实有 express-sessions 来保存我的登录会话。第一个会话被第二个用户覆盖,第二个用户在第一个用户在线时登录,用第二个用户替换了第一个用户的凭据,现在我让用户 2 在两个不同的浏览器中在线。
尽管我在不同的浏览器和不同的设备上尝试过此操作,问题是节点应用程序在 localhost 本地托管。当我将应用程序上传到 heroku 并从那里访问它时,用户会话没有被覆盖。
这是将用户传递给视图的获取请求
app.get('/blog/:id', function(req, res) {
// Define which page
res.render('blog', {
user: req.user,
});
});
这是一个文本区域,该页面上的所有用户都应该存储他们的名字。
<textarea readonly id="usersInRoom" placeholder="<%= user.username %>"></textarea>
这成功地将正确的用户名设置为占位符。如果第二个用户呈现相同的视图并与第一个用户同时访问此页面,则第二个用户的用户名将是唯一的占位符。如何存储第一个用户名,以便当第二个用户打开页面时,占位符可以是第一个用户名 + 第二个用户名的串联?第一个用户存储在任何嵌入式 javascript 数组等中的数据对第二个用户不可用。
如果您使用的是 SignalR,那么您可以将当前用户列表广播到每个连接并像 sample chat application 中那样更新视图。
如果您使用的是常规 ajax 服务器轮询,请设置客户端方法以从数据库存储中获取当前页面用户列表的时间间隔。由于 http 缺少状态,如果有一段时间未发帖,您将不得不 'retire' 列表中的用户。
客户代码:
setInterval(checkServer,5000);
function checkServer(){
//some ajax call to the server here
//that returns your user list
...
success:function(result){
$('#usersInRoom').val(result);
}
}
服务器代码(假设您将所有当前页面用户保存在 table 带有一个名为 LastModified 的字段):
CurrentPageUser class(将其作为 CurrentPageUsers table 存储在您的 DbContext 中):
public class CurrentPageUser{
public int Id {get;set;}
public DateTime LastModified {get;set;}
public string Name {get;set;}
}
控制器方法:
public string GetCurrentUsers(int selfid){
using (var db=new DbContext()){
var now=DateTime.Now;
//update your requesting user so other users can see him/her
db.CurrentPageUsers.Find(selfid).LastModified=now;
db.SaveChanges();
DateTime timelimit = now.AddMinutes-5);
return string.Join(", ",
db.CurrentPageUsers.Where(u=>
u.LastModified<timelimit).Select(u=>u.Name).ToList());
}
}
请注意,SignalR 实现具有更好的性能,并且在服务器端实现起来不那么笨拙,不需要数据库 table 来存储当前页面用户。它就是为这种场景而制作的。
我找到了解决办法。事实上,我确实有 express-sessions 来保存我的登录会话。第一个会话被第二个用户覆盖,第二个用户在第一个用户在线时登录,用第二个用户替换了第一个用户的凭据,现在我让用户 2 在两个不同的浏览器中在线。
尽管我在不同的浏览器和不同的设备上尝试过此操作,问题是节点应用程序在 localhost 本地托管。当我将应用程序上传到 heroku 并从那里访问它时,用户会话没有被覆盖。