2

我一直在尝试使用 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");
        }
    });
}
4

2 回答 2

2

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

于 2013-02-14T08:23:37.310 回答
1

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

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

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

于 2013-02-13T22:59:11.267 回答