Javascript 在使用NodeJS并保存到MongoDB时,如何同步多个RESTFul请求?

Javascript 在使用NodeJS并保存到MongoDB时,如何同步多个RESTFul请求?,javascript,node.js,mongodb,mongoose,synchronous,Javascript,Node.js,Mongodb,Mongoose,Synchronous,我一直在尝试用NodeJS实现restfulapi,并使用Mongoose(MongoDB)作为数据库后端 下面的示例代码在同时发送请求时使用相同的用户名注册多个用户,这不是我想要的。虽然我试着加一张支票 我知道这种情况的发生是因为NodeJS的异步特性,但是我找不到一种方法来正确地做到这一点。看起来“findOne”方法立即返回,导致registerUser返回,然后处理另一个请求 顺便说一下,我不想用单独的API函数检查现有用户,我需要在注册阶段进行检查。有没有办法做到这一点 Control

我一直在尝试用NodeJS实现restfulapi,并使用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");
        }
    });
}

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

要解决这个问题,您需要一种方法来控制此时只处理一个用户,您可以通过将所有registerUser请求添加到队列中,然后将它们逐个从队列中拉出,并仅在从队列中处理后调用res.Send来实现这一点


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

你应该考虑在模式中设置用户名是唯一的。这将确保用户名是唯一的,即使同时请求设置相同的用户名。

你会考虑在模式中设置用户名是唯一的吗?@ AlmiPalb宾果!我想有时候我需要休息一下,解决办法很简单!:)你能考虑给我一个简短的答案,让我能接受你的答案吗?谢谢!谢谢你的评论。虽然我发现它们很有用,但我相信真正的解决方案是在MongoDB中设置唯一的用户名字段。