首页 > 解决方案 > 在 Node/Express 中同时处理客户端请求

问题描述

我想在我的快速服务器中处理同时的用户请求,并将来自它们的数据存储在 Mongo db 中。我已经准备好所有代码,但是,我正在努力寻找一种方法来为每个用户请求分配一个唯一的 id,以便我可以将每个用户的数据保存到 Mongo db。

下面是我的代码示例。

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)都必须克服这个问题,因为它们会收到数以百万计的客户请求,并且必须区分所有这些请求以便将数据存储在其数据库中。

标签: mongodbexpress

解决方案


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

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

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

正如您已经发现的那样,IP 地址对用户来说是一个糟糕的代理,因为许多用户可以共享同一个 IP 地址(通过家庭、公司和移动网关网关)。随着移动用户在网络上四处走动,同一设备的更多 IP 地址可能会发生变化。

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

如果他们将用户数据长期存储在他们的数据库中,那么他们将使用用户登录和持久 cookie 来识别用户,并将数据存储在他们的数据库中,用于 cookie 指示的特定用户 ID。请注意,用户 ID 通常不直接在 cookie 中以防止欺骗用户,而是在 cookie 中提供一些其他参考,他们可以查找并转换为用户 ID,然后可以使用数据库中的密钥来存储内容那个特定的用户。


推荐阅读