Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点sqlite3:尝试编写函数以返回行数组_Node.js_Sqlite_Node Sqlite3 - Fatal编程技术网

Node.js 节点sqlite3:尝试编写函数以返回行数组

Node.js 节点sqlite3:尝试编写函数以返回行数组,node.js,sqlite,node-sqlite3,Node.js,Sqlite,Node Sqlite3,我的问题的背景是,我正在尝试创建一个网站注册页面,在其中,我正在尝试检查数据库中是否已经包含一封电子邮件。为了做到这一点,我试图写一个函数,它将返回数据库中的所有电子邮件,这样我就可以做一个 if (emails.includes(new_user_email) { return error; } 这类事情 基本上,我想要的东西,可以返回一个布尔告诉我,如果电子邮件已经存在。因此,返回一个数组,我可以检查,甚至只是在数据库中搜索电子邮件,但在返回true或false之前要等待 我尝试

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

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(7.6+)的最新版本,我建议您切换到支持承诺的库,而不是只支持回调。使用
async
/
wait
可以轻松处理异步操作。一个好的候选人将是一揽子计划

一旦你切换到它(非常容易做到,它们是相似的),你只需使你的
get\u all\u email
功能异步即可。下面是它的外观:

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

    return emails;
}
上面的代码使用
await db.all
检索行,并将它们映射到电子邮件以创建数组。您可以使用
wait wait get_all_emails()
(如果您从异步函数调用它)或使用
get_all_emails()。然后((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正是出于这个原因——也许是时候从我的固执中退出来,做出改变了。