gpt4 book ai didi

node.js - 随机生成一个不在 mongodb 中的值?

转载 作者:可可西里 更新时间:2023-11-01 09:36:43 28 4
gpt4 key购买 nike

我正在尝试在 Node 中生成 session ID 并将它们存储在 MongoDB 中。对于我的应用程序,我只想生成一个随机的 6 位数字(此数字用于同步两个 session ,因此用户可以轻松复制它)。我想生成一个不在我的 MongoDB 中的 sessions 集合中的数字。我的第一个想法可能会在 99% 的时间里起作用:

function GetSessionKey(cb) {
var key = parseInt(Math.random() * 1000000).toString();
while (key.length < 6) key = '0' + key;
db.sessions.find({ Key: key }, function (err, docs) {
if (!err && docs.length == 0) {
cb(key);
} else {
GetSessionKey(cb);
}
});
}

但是生成的 key 不断地选择mongo中现有的 key 的可能性很小。或者所有 key 都已在使用中的可能性(我不希望发生这种情况)。

我知道 Node 是异步的,但这是否意味着如果它不断被调用,像这样的递归异步调用将填满堆栈?还是异步调用不会被放入堆栈?有没有更好的方法来生成简短的唯一 key ?旧 key 将被移除并可以重复使用,所以我不认为这是一个定时炸弹。我只是担心随机方面可能会引起麻烦。

最佳答案

另一种方法是使用 MongoDB 来强制执行唯一性。例如,在 Mongo shell 中的 Key 字段上创建一个唯一索引:

db.sessions.ensureIndex( { Key: 1 }, { unique: true } )

修改 Node.js 代码以插入生成的随机值并测试 err 变量是否存在重复键错误。如果没有错误,你就可以开始了。否则,重新生成值并重试。您可以像这样测试重复键错误:

...
db.sessions.insert({ Key: key }, function (err, docs) {
...
if (err) {
if (err.code && err.code == 11000) {
// Duplicate key error. Generate a new random value and insert again.
} else {
throw err;
}
}
...

如果您可以将生成的 key 存储在 _id 字段而不是 Key 中,那么您可以跳过 ensureIndex(...) 作为MongoDB 自动在 _id 上创建一个唯一索引。

关于node.js - 随机生成一个不在 mongodb 中的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20818205/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com