【问题标题】:Node sqlite3: Trying to write a function to return an array of rows节点 sqlite3:试图编写一个函数来返回一个行数组
【发布时间】:2019-05-23 23:18:27
【问题描述】:

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

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;
    });
}

【问题讨论】:

    标签: node.js sqlite node-sqlite3


    【解决方案1】:

    如果您使用的是最新版本的 Node.js (7.6+),我建议您切换到支持 Promise 而不仅仅是回调的库。这将使使用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

    希望这会有所帮助!

    【讨论】:

    • 感谢您的回复!出于这个确切原因,我的讲座建议使用 sqlite 而不是 sqlite3 - 也许是时候从我的固执中退缩并做出改变了。
    猜你喜欢
    • 2020-02-16
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2019-10-18
    • 2012-12-25
    相关资源
    最近更新 更多