我正在将 Express 服务器与 Node.js 结合使用,并且担心并发性并阻止用户同时使用相同的用户名创建帐户。根据我的理解,尽管主要的 Node.js 运行时是单线程的,但仍然有可能一个函数开始而另一个函数尚未完成。 一种选择是在 Redis 等外部源上创建一个锁,并使用它来控制并发性——但我的问题是——在原生 JavaScript 中是否有一种可靠的方法来控制它?例如,一定程度的嵌套函数是否基本上可以保证新请求不会在另一个请求完成之前启动某个调用(我对此表示怀疑)。
更具体地说,我将 MongoDB 与 Mongoose 结合使用。使用 Mongoose 模式的内存中应该有一个唯一的用户列表。那么会发生什么:
(1) 新用户用用户名A注册
(2) node.js 将A 与用户索引列表进行比较,发现A 确实是一个新的用户名
(3) node.js 调用数据库将 A 添加到列表
(4)(4)before (3) 完成一个新用户用用户名 A 注册...node.js 将 A 与用户名索引进行比较,它看起来是唯一的,因此它向 DB 发送一个插入
问题似乎是真实的。我的猜测是解决它的最佳方法是使用外部锁。
最佳答案
解决这个问题最直接的方法是使用 unique index在相应的 mongo 集合上。这将防止任何会导致重复值的插入或更新(请注意,这是由 mongodb 服务器强制执行的,而不是 mongoose)。
我不熟悉 Mongoose ,但似乎当您告诉它一个属性是唯一的时,它会创建相应的唯一索引。
关于javascript - 创建锁,这样两个用户就不会使用相同的用户名创建帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31085667/