如何在NodeJS中编写同步块

时间:2017-11-06 06:25:01

标签: javascript node.js race-condition

我的问题是我正在尝试开发NodeJs REST服务,人们可以在我的网站上注册自己。我的注册流程是这样的:

1.检查是否有任何用户使用相同的电子邮件退出

  1. 如果用户存在,请发送回复以告知该用户已存在

  2. 如果用户不存在,请使用输入的详细信息创建一个用户对象。

  3. 4.现在将其插入数据库。

    1. 发送用户已注册的回复。
    2. 现在让我们说我有两个用户" A"和" B" ,他们输入了相同的电子邮件ID,现在让我们说用户A和B都达到我的代码将检查用户是否退出的点,他们都会得到该用户不存在,他们的流程将转向创建对象并在DB上创建对象。 现在在这种情况下,如果我们在Java中有一个synchronized块,我们可以防止这两种情况同时创建对象,但在NodeJS中我该如何实现呢?以及如何避免这种竞赛的局面?

      NodeJ是单线程还是具有公共堆栈会阻止这种情况发生吗?或者如果在NodeJ中有任何其他方法可以做到这一点? 我是NodeJs的新手,如果我提到错误,我很抱歉。

1 个答案:

答案 0 :(得分:2)

  

严格来说,node.js在一个线程上运行,但是你的程序   工作流,包括I / O(数据库,文件系统),客户端和   一切都在很多线程上运行。

来源:Can node.js code result in race conditions?

我该怎么办?

您可以使用事务在数据库级别中防止出现这种情况。或者您也可以在应用层中进行预防。

数据库层

您可以使用(并且应该使用)事务(假设SQL)来确保数据的一致性和完整性。

应用层

此外,使用输入电子邮件的hashmap跟踪内存中的寄存器状态:

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

})

这种方法可以防止您的问题。