【问题标题】:How to synchronise multiple RESTFul requests when using NodeJS and saving to MongoDB?使用NodeJS并保存到MongoDB时如何同步多个RESTFul请求?
【发布时间】:2013-02-14 16:23:37
【问题描述】:

我一直在尝试使用 NodeJS 实现 RESTFul API,并且我使用 Mongoose (MongoDB) 作为数据库后端。

以下示例代码在同时发送请求时使用相同的用户名注册多个用户,这不是我想要的。虽然我尝试添加支票!

我知道这是因为 NodeJS 的异步特性而发生的,但我找不到正确执行此操作的方法。看起来“findOne”方法立即返回,导致registerUser返回,然后处理另一个请求。

顺便说一句,我不想​​用单独的API函数检查现有用户,我需要在注册阶段检查。有没有办法做到这一点?

Controller.prototype.registerUser = function (req, res) {
    Users.findOne({'user_name': req.body.user_name}, function(err, user) {
        if(!user) {
            new User({user_name: req.body.user_name}).save(function(err) {
                if(!err) {
                    res.send("User saved");
                } else {
                    res.send("DB Error: Could not save user!");
                }
            });
        } else {
            res.send("User exists");
        }
    });
}

【问题讨论】:

  • 您是否考虑将用户名设置为在架构中是唯一的。
  • @almypal 宾果游戏!我想有时我需要休息一下,解决办法就是这么简单! :) 您是否会考虑添加一个简短的答案来说明我该怎么做,以便我可以接受您的回答?非常感谢!

标签: javascript node.js mongodb mongoose synchronous


【解决方案1】:

您应该考虑将 user_name 设置为在 Schema 中是唯一的。即使同时请求设置相同的用户名,这也将确保 user_name 保持唯一。

【讨论】:

    【解决方案2】:

    是的,发生这种情况的原因正如您所怀疑的那样,因为多个请求可以同时执行代码,因此 User.fineOne 可以多次返回 false。顺便说一句,其他堆栈也可能发生这种情况,即使是每个请求使用一个线程的堆栈。

    为了解决这个问题,您需要一种方法来控制当时只有一个用户正在处理,您可以通过将所有 registerUser 请求添加到队列中然后将它们逐个从队列中拉出来完成此操作仅在从队列中处理完 res.Send 后才调用 res.Send。

    或者,也许您可​​以保留一个本地用户名数组,每次有新请求进入时检查该数组是否已经存在。如果没有将其添加到数组中并对其进行处理。如果它在数组中,则发送响应“用户存在”。然后,一旦成功创建了用户,您就可以将其从该数组中删除。 (我还没有想过这个 100%,但我认为它应该也可以。)

    【讨论】:

    • 感谢 cmets。虽然我发现它们很有用,但我相信真正的解决方案是在 MongoDB 中将 user_name 字段设置为唯一。
    猜你喜欢
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2016-09-09
    • 1970-01-01
    相关资源
    最近更新 更多