Javascript 如何在NodeJS中编写同步块

Javascript 如何在NodeJS中编写同步块,javascript,node.js,race-condition,Javascript,Node.js,Race Condition,我的问题是,我正在尝试开发一个NodeJs REST服务,人们可以使用它在我的网站上注册自己。我的注册流程如下: 1.检查是否有用户使用相同的电子邮件退出 如果用户存在,则发送响应以告知该用户已存在 如果用户不存在,请使用输入的详细信息创建用户对象 4.现在将其插入数据库 发送用户已注册的响应 现在让我们假设我有两个用户“A”和“B”,他们输入了相同的电子邮件ID,现在让我们假设用户A和B都达到了一个点,我的代码将检查用户是否退出,他们都将得到该用户不存在,他们的流将朝着创建对象和在DB上创建对

我的问题是,我正在尝试开发一个NodeJs REST服务,人们可以使用它在我的网站上注册自己。我的注册流程如下:

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

  • 如果用户存在,则发送响应以告知该用户已存在

  • 如果用户不存在,请使用输入的详细信息创建用户对象

  • 4.现在将其插入数据库

  • 发送用户已注册的响应
  • 现在让我们假设我有两个用户“A”和“B”,他们输入了相同的电子邮件ID,现在让我们假设用户A和B都达到了一个点,我的代码将检查用户是否退出,他们都将得到该用户不存在,他们的流将朝着创建对象和在DB上创建对象的方向移动。 现在,在这种情况下,如果存在Java中的同步块,我们可以防止这两种情况同时创建对象,但在NodeJS中,如何实现这一点?如何避免这种绕场比赛的情况

    nodej是单线程的并且有一个公共堆栈会防止这种情况发生吗?或者,在NodeJs中是否有其他方法可以做到这一点? 我对NodeJs很陌生,如果我提到了一些错误,我很抱歉

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

    资料来源:

    我能做些什么来预防? 您可以使用事务在数据库级别防止这种情况。或者您也可以在应用程序层中防止

    数据库层 您可以使用(并且应该使用)事务(假设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
    
    })
    

    这种方法可以防止出现问题。

    解决这一问题的最简单方法不是放弃异步模型,而是正确设计数据库。如果
    电子邮件
    被声明为唯一索引,则B在尝试创建记录时将收到错误。处理这个错误,一切都很好。(这样你甚至不需要检查用户是否存在——只要尝试创建它并拒绝数据库抛出完整性错误。)我想在应用程序级别处理它,你可以用JS编写自己的信号量:它只是一个简单的布尔变量,两个异步进程都可以访问。感谢Ozgur GUL,我只是在寻找一个应用层解决方案,谢谢你的解决方案,我会测试它,看看它是否有效