node.js - Node sqlite3 : Trying to write a function to return an array of rows

标签 node.js sqlite node-sqlite3

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

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

类似的事情。

本质上,我想要一些可以返回 bool 值的东西,告诉我电子邮件是否已经存在。因此返回一个我可以检查的数组,甚至只是在数据库中搜索电子邮件,但在返回 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 (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

希望这有帮助!

关于node.js - Node sqlite3 : Trying to write a function to return an array of rows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56277590/

相关文章:

node.js - Mongoosejs - 我可以修改 'find' 的后查询中间件中的文档吗?

javascript - 端口 3000 已在使用 [nodemon] 应用程序崩溃 - 在启动前等待文件更改

c++ - 在 C++ 中使用 SQLite : object function as a callback

windows - SQLite 错误参数或其他 API 误用

javascript - 无法等待 Node.js 中的 sqlite3.Database.get() 函数完成

javascript - mysql Node js的问题

mysql - NodeJS 异步/等待类 mysql/mariadb

ios - 在cocos2d-x中使用数据库(如sqlite)

node.js - SQLite3 Node.js JSON