1

我的问题的上下文是我正在尝试做一个网站注册页面,并且在其中,我正在尝试检查数据库中是否已经包含电子邮件。为此,我正在尝试编写一个函数,该函数将返回数据库中的所有电子邮件,这样我就可以做一个

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

之类的事情。

本质上,我想要一些可以返回布尔值的东西,告诉我电子邮件是否已经存在。所以返回一个我可以检查的数组,甚至只是在数据库中搜索电子邮件,但在返回真或假之前等待。

我已经尝试过下面的函数来返回一组电子邮件,尽管我知道由于 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;
    });
}
4

1 回答 1

1

如果您使用的是最新版本的 Node.js (7.6+),我建议您切换到支持 Promise 而不仅仅是回调的库。这将使使用async/处理异步操作变得容易awaitsqlite包是一个不错的选择。

一旦你切换到它(很容易做到,它们很相似),你只需要让你的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

希望这可以帮助!

于 2019-05-23T15:18:27.233 回答