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