【问题标题】:Handling simultaneous client requests in Node/Express在 Node/Express 中同时处理客户端请求
【发布时间】:2021-01-28 05:49:44
【问题描述】:

我想在我的快速服务器中同时处理用户请求,并将来自它们的数据存储在 Mongo 数据库中。我已经准备好所有代码,但是,我正在努力寻找一种方法来为每个用户请求分配一个唯一的 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)都必须克服这个问题,因为它们会收到数百万个客户请求,并且必须区分所有这些请求才能将数据存储在其数据库中。

【问题讨论】:

    标签: mongodb express


    【解决方案1】:

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

    passport 之类的库甚至可以让您利用其他服务(例如 Google、Facebook、Twitter 等)的登录信息……而不是让用户创建自己的新服务登录信息。

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

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

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

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

    【讨论】:

    • 感谢您的帮助。我只需要一种临时方法来跟踪每个客户端(仅在他们使用应用程序时,应该只有大约 30 分钟),所以 cookie 似乎是一个不错的选择。我的理解是cookies是从服务器发送到客户端的。您似乎在说cookie可以从客户端发送到服务器。是否有用于标识用户 cookie 的请求参数的方法(例如 request.cookie)?
    • @duplek - Cookie 通常由服务器设置,方法是使用响应上的 Set-Cookie 标头将它们附加到对来自客户端的请求的响应。合作的客户端(例如浏览器)然后接收这些 cookie 并存储它们。在以后对该服务器的任何请求中,它们会使用 Cookie 标头与这些请求一起发回相同的 cookie。因此,服务器将在来自合作客户端的所有未来请求中接收先前设置的 cookie,直到 cookie 过期或被删除。请记住,cookie 只会发送回它们最初来自的服务器。
    • @duplek - 有一个简单的例子,cookie 由服务器设置,然后由客户端发回 here on MDN
    • 感谢您的澄清,该链接也很有帮助!我现在要花一些时间研究在 Node 中实现 HTTP cookie,似乎有很多很好的资源,所以感谢您的指导!
    猜你喜欢
    • 2017-07-10
    • 2013-11-17
    • 2020-12-20
    • 2023-01-14
    • 1970-01-01
    • 2017-05-14
    • 2019-06-03
    • 2018-05-31
    • 1970-01-01
    相关资源
    最近更新 更多