Для корректной организации процесса генерации и проверки мнемонической фразы, необходимо убедиться, что происходит повторная генерация новой фразы, если случайно сгенерированная фраза уже существует в базе данных. Давайте добавим цикл для генерации новой фразы, который будет продолжаться до тех пор, пока не будет найдена уникальная фраза.
Вы можете изменить ваш скрипт следующим образом:
```javascript
async function generateUniqueMnemonic() {
let mnemonic;
// Запускаем бесконечный цикл, который будет прерываться только при успешной генерации уникальной мнемонической фразы
while (true) {
mnemonic = generateMnemonic(); // функция, которая генерирует мнемоническую фразу
try {
const existingMnemonic = await mnemonicDb.get(mnemonic);
// Если фраза уже существует в базе, выводим сообщение и продолжаем цикл
console.log("❌ Эта мнемоническая фраза уже существует в базе данных. Генерируем новую...");
} catch (err) {
// Проверяем, является ли ошибка 'notFound' - не найден ключ
if (err && err.notFound) {
// Фраза не найдена, добавляем её в базу данных
try {
await mnemonicDb.put(mnemonic, { timestamp: Date.now() });
console.log(`✅ Мнемоническая фраза добавлена в базу данных: ${mnemonic}`);
break; // Выход из цикла, так как мнемоническая фраза уникальна
} catch (error) {
console.error("Ошибка при добавлении фразы в базу данных:", error);
break; // Или можно продолжить цикл в случае ошибки при добавлении
}
} else {
console.error("Ошибка при запросе к базе данных мнемонических фраз:", err);
break; // Выход из цикла в случае ошибки запроса к БД
}
}
}
}
// Вызов функции для генерации уникальной мнемонической фразы
generateUniqueMnemonic();
```
### Изменения, внесенные в код:
1. **Бесконечный цикл `while (true)`**: Он будет продолжать генерировать новую фразу до тех пор, пока не найдется уникальная. Мы используем `break;`, чтобы выйти из цикла, когда фраза успешно добавлена в базу данных.
2. **Логика генерации новой фразы**: Мы просто вызываем `generateMnemonic()` для генерации новой фразы в начале каждого цикла.
3. **Условия и обработка ошибок**: Мы добавляем обработку ошибок отдельно, чтобы в случае ошибки, не связанной с отсутствием ключа, выйти из цикла.
Этот код позволит избежать бесконечного цикла генерации фраз и правильно обработает ситуацию, когда фраза уже существует в базе данных.