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

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

以下示例代码在同时发送请求时使用相同的用户名注册多个用户,这不是我所期望的。 虽然我试图添加一个检查!

我知道这是因为NodeJS的asynchronous性质,但我找不到一个方法来正确执行此操作。 它看起来像“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_name设置为唯一的。 这将确保user_name保持唯一,即使同时请求设置相同的用户名。

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

为了解决这个问题,你需要某种方法来控制当时只有一个用户正在工作,你可以通过将所有的registerUser请求添加到一个队列中,然后一个接一个地从队列中拉出并调用res来完成。从队列中处理之后才发送。

或者,也许你可以保留一个本地数组的用户名,每次有新的请求进来,检查数组是否已经存在。 如果不是将它添加到数组并在其上工作。 如果它在数组中,则发送响应“用户存在”。 然后,一旦用户成功创build,您可以从该数组中删除它。 (我没有想过这个100%,但我认为它也应该可以。)