在Node/Express中处理客户端同时请求



我想在我的express服务器上处理同步用户请求,并将数据存储在Mongo数据库中。我已经准备好了所有的代码,但是,我正在努力找到一种方法来分配一个唯一的id到每个用户的请求,这样我就可以从每个用户保存数据到mongodb数据库。

下面是我的代码示例。

app.post("/page1", function(request,response) {    
var ipAddress = request.connection.remoteAddress;
var name1 = request.body.name1;
MongooseModel.findOneAndUpdate({id: ipAddress},{name1:name1},
{upsert: false}, function() {});
response.redirect('/page2');
});

正如您所看到的,我试图根据IP地址区分每个客户端请求。下面的代码在上面的代码之后直接运行。

app.post("/page2", function(request,response) {    
var ipAddress = request.connection.remoteAddress;
var name2 = request.body.name2;
MongooseModel.findOneAndUpdate({id: ipAddress},{name2:name2},
{upsert: false}, function() {});
response.redirect('/page3');
});

再一次,我试图区分每个客户端请求基于他们的IP地址。不幸的是,我上面的代码只有在两个(或更多)客户端不共享相同的网络连接时才能工作。如果是,request.connection。remoteAddress返回相同的值,我的数据库混淆了。

这个问题有聪明的解决办法吗?我知道大多数网站(如amazon.com)都必须克服这个问题,因为他们收到数百万个客户端请求,并且必须区分所有这些请求以便将数据存储在他们的数据库中。

识别客户端最可靠的方法是要求登录,然后通过他们的userID来识别他们(在他们创建帐户时定义为唯一的东西,然后在他们登录时由用户指定)。您通过会话cookie跟踪登录状态。express-session之类的东西通常用于自动创建此cookie,并为您提供在会话中存储临时状态的位置。如果在它上面添加一个用户登录,这样做的好处是它可以跨计算机和跨时间识别同一用户。

像passport这样的库甚至可以让你利用其他服务的登录,如Google, Facebook, Twitter等…而不是让用户创建自己的新登录到您的服务。

一种更临时的跟踪特定用户的方法是设置一个包含唯一标识符的cookie,然后使用该cookie作为用户标识符。由于该cookie将与来自该特定设备的任何未来请求一起显示,因此您可以将其用作用户的短期代理。但是,这只适用于短期识别,因为cookie可以被删除,它们与特定设备相关,而不是特定用户,并且不能跨设备工作。

正如你已经发现的,IP地址是一个糟糕的用户代理,因为许多用户可以共享相同的IP地址(通过家庭、公司和移动网关网关)。当移动用户在网络上移动时,同一设备的IP地址可以更改。

我知道大多数网站(如amazon.com)都必须克服这个问题,因为他们接收数百万个客户端请求,并且必须区分所有这些请求以便将数据存储在他们的数据库中。

如果他们将用户数据长期存储在他们的数据库中,那么他们将使用用户登录和持久的cookie来标识用户,并将cookie指示的特定userID的数据存储在他们的数据库中。注意,userID通常不是直接在cookie中,以防止欺骗用户,而是在cookie中有其他引用,用户可以查找并转换为userID,然后可以在数据库中作为键使用userID来存储特定用户的内容。

最新更新