这是一个get请求,用户被传递给视图
app.get('/blog/:id', function(req, res) {
// Define which page
res.render('blog', {
user: req.user,
});
});
这是一个textarea,此页面上的所有用户都应该存储其名称。
<textarea readonly id="usersInRoom" placeholder="<%= user.username %>"></textarea>
这成功地将正确的用户名设置为占位符。如果第二个用户呈现相同的视图并与第一个用户同时访问此页面,则第二个用户的用户名将是唯一的占位符。如何存储第一个用户名,以便当第二个用户打开页面时,占位符可以是第一个用户名+第二个用户名的串联?第一个用户存储在任何嵌入式javascript数组等中的数据不可供第二个用户使用。
答案 0 :(得分:0)
如果您使用的是SignalR,那么您可以将当前的用户列表广播到每个连接,并像sample chat application一样更新视图。
如果使用常规ajax服务器轮询,请在一个间隔上设置客户端方法,该间隔从数据库存储中获取当前页面用户的列表。由于http缺乏状态,如果用户暂时没有发布,则必须从列表中“退出”用户。
客户代码:
setInterval(checkServer,5000);
function checkServer(){
//some ajax call to the server here
//that returns your user list
...
success:function(result){
$('#usersInRoom').val(result);
}
}
服务器代码(假设您将所有当前页面用户保存在表格中 使用名为LastModified的字段:
CurrentPageUser类(将其作为CurrentPageUsers表存储在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实现具有更好的性能,并且在服务器端实现不那么笨拙,不需要数据库表来存储当前页面用户。它是为这种情况而制作的。
答案 1 :(得分:0)
我找到了解决方案。事实上我确实有持续登录会话的快速会话。第一个会话被第二个用户覆盖,该用户在第一个用户在线时登录,用第二个用户替换了第一个用户的凭证,现在我在两个不同的浏览器中有用户2在线。
虽然我在不同的浏览器上尝试过这种方式,但是来自不同的设备,的问题是节点应用是在localhost本地托管。当我将应用程序上传到heroku并从那里访问时,用户会话没有被覆盖。