#javascript #mongodb #function #mongoose
#javascript #mongodb #функция #mongoose
Вопрос:
// Assign unique krypter id
assignKrypterID = () =>
{
let id = Math.floor(Math.random()*(999999-100000) 100000);
console.log(id);
Krypter
.findOne({krypter_id: id.toString()})
.then(krypter => {
if (krypter)
assignKrypterID()
else
return id.toString()
})
.catch(err => console.log(err))
}
const newKrypter = new Krypter({
handle: req.body.handle,
password: req.body.password, // plain text
krypter_id: assignKrypterID()
});
// Hashes the plaintext password and saves it
bcrypt.genSalt(10, (err, salt) => {
bcrypt.hash(newKrypter.password, salt, (err, hash) => {
if (err) throw err;
newKrypter.password = hash; // encrypted password
newKrypter
.save()
.then(krypter => res.json(krypter))
.catch(err => console.log(err));
})
});
Я попытался присвоить уникальный 6-значный идентификатор каждому пользователю во время регистрации, используя функцию ‘assignKrypterID()’. Но получается следующая ошибка:
Это моя схема:
const KrypterSchema = new Schema({
handle: {
type: String,
required: true
},
password: {
type: String,
required: true
},
krypter_id: {
type: String,
required: true
}
});
Разве этого нельзя достичь с помощью рекурсии? Или рекурсия здесь плохой ход?
Помогите мне, как изменить это, чтобы определить, присвоен ли случайно сгенерированный идентификатор объекту.
Комментарии:
1. Краткое примечание: лучше скопировать вставленный текст, а не публиковать скриншот. (Доступность, поисковые системы, удобное копирование / вставка …)
2.
assignKrypterID()
функция ничего не возвращает. я предполагаю, что реализация функции неверна, вы не должны рекурсивно запрашивать mongodb, это довольно тяжело, вместо этого вы должны найти все идентификаторы сразу и выполнить поиск в массиве идентификаторов. Также лучше использовать async / await вместо выполняемых обещаний.
Ответ №1:
assignKrypterID = async() => {
try {
let krypter_ids = await Krypter.find({}).map(obj => obj.krypter_id)
let flag = true
while (flag) {
let id = Math.floor(Math.random() * (999999 - 100000) 100000);
console.log(id);
if (krypter_ids.includes(id)) {
continue;
} else {
flag = false
return id.toString()
}
}
} catch (err) {
throw err
console.log(err)
}
}
async function foo() {
try {
let krypter_id = (await assignKrypterID()) || ""
const newKrypter = new Krypter({
handle: req.body.handle,
password: req.body.password, // plain text
krypter_id: krypter_id
});
// Hashes the plaintext password and saves it
let salt = await bcrypt.genSalt(10)
let hash = await bcrypt.hash(newKrypter.password, salt)
newKrypter.password = hash; // encrypted password
let krypter = await newKrypter.save()
res.json(krypter)
} catch (err) {
console.log(err)
throw err
}
}
foo()