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正是出于这个原因——也许是时候从我的固执中退出来,做出改变了。