Javascript 如何在NodeJS中编写同步块
我的问题是,我正在尝试开发一个NodeJs REST服务,人们可以使用它在我的网站上注册自己。我的注册流程如下: 1.检查是否有用户使用相同的电子邮件退出Javascript 如何在NodeJS中编写同步块,javascript,node.js,race-condition,Javascript,Node.js,Race Condition,我的问题是,我正在尝试开发一个NodeJs REST服务,人们可以使用它在我的网站上注册自己。我的注册流程如下: 1.检查是否有用户使用相同的电子邮件退出 如果用户存在,则发送响应以告知该用户已存在 如果用户不存在,请使用输入的详细信息创建用户对象 4.现在将其插入数据库 发送用户已注册的响应 现在让我们假设我有两个用户“A”和“B”,他们输入了相同的电子邮件ID,现在让我们假设用户A和B都达到了一个点,我的代码将检查用户是否退出,他们都将得到该用户不存在,他们的流将朝着创建对象和在DB上创建对
var PENDING_EMAILS = {}
app.post("/register", function(req, res) {
var email = req.body.email
if(PENDING_EMAILS[email]) {
return res.send("Email is busy")
}
PENDING_EMAILS[email] = true // check this email as busy
// register operation
// check in DB etc...
delete PENDING_EMAILS[email] // also, release hashmap key when register finishes or when there is an error
})
这种方法可以防止出现问题。解决这一问题的最简单方法不是放弃异步模型,而是正确设计数据库。如果
电子邮件
被声明为唯一索引,则B在尝试创建记录时将收到错误。处理这个错误,一切都很好。(这样你甚至不需要检查用户是否存在——只要尝试创建它并拒绝数据库抛出完整性错误。)我想在应用程序级别处理它,你可以用JS编写自己的信号量:它只是一个简单的布尔变量,两个异步进程都可以访问。感谢Ozgur GUL,我只是在寻找一个应用层解决方案,谢谢你的解决方案,我会测试它,看看它是否有效