Узел sqlite3: Попытка написать функцию для возврата массива строк - PullRequest
0 голосов
/ 23 мая 2019

Контекст моей проблемы в том, что я пытаюсь создать страницу регистрации на сайте, и в рамках этого я пытаюсь проверить, включено ли письмо в базу данных. Для этого я пытаюсь написать функцию, которая будет возвращать все электронные письма в базе данных, чтобы я мог затем сделать

if (emails.includes(new_user_email) {
    return error;
 }

такие вещи.

По сути, я хотел бы получить что-то, что может вернуть логическое значение, сообщающее, если электронная почта уже существует. Так что возвращает массив, который я могу проверить, или даже просто искать электронную почту в базе данных, но он ждет, прежде чем вернуть true или false.

Я попробовал функцию ниже, чтобы вернуть массив писем, хотя я понимаю, что это не работает из-за асинхронной природы sqlite3. Моя проблема в том, что я не могу получить функцию, которая ожидает запуска кода sql, прежде чем вернуть результат.

function get_all_emails() {
    let emails = []
    db.all("SELECT email FROM users", [], (err, rows) => {
        if (err) {
            throw err;
        }
        rows.forEach((row) => {
            emails.push(row.email);
        });
        return emails;
    });
}

1 Ответ

0 голосов
/ 23 мая 2019

Если вы используете последнюю версию Node.js (7.6+), я бы посоветовал вам переключиться на библиотеку, которая поддерживает обещания, а не только обратные вызовы.Это облегчит обработку асинхронных операций, используя async / await.Хорошим кандидатом может быть пакет sqlite .

После того, как вы переключитесь на него (это очень легко сделать, они похожи), вам просто нужно сделать вашу get_all_emails функцию асинхронной.Вот как это будет выглядеть:

async function get_all_emails() {
    const emails = (await db.all("SELECT email FROM users", [])).map((row) => row.email);

    return emails;
}

Приведенный выше код извлекает строки, используя await db.all, и сопоставляет их с электронными письмами для создания массива.Вы можете вызвать эту функцию откуда-то еще, используя await get_all_emails() (если она вызывается асинхронной функцией) или get_all_emails().then((emails) => {...}).catch((err) => {...}).

Тем не менее, лучшее, что можно сделать, чтобывы хотите получить только те строки, которые соответствуют электронной почте, и проверить, равна ли длина найденных строк 0.

async function is_email_available(email) {
  const rows = await db.get('SELECT id FROM users WHERE email = ?', email);
  return rows.length === 0;
}

Это вернет true, если электронное письмо доступно, и false, если нет.

Надеюсь, это поможет!

...