Javascript函数更改变量值
我目前正在开发注册页面,我想检查数据库中是否已经存在电子邮件地址Javascript函数更改变量值,javascript,node.js,postgresql,function,Javascript,Node.js,Postgresql,Function,我目前正在开发注册页面,我想检查数据库中是否已经存在电子邮件地址 var emailnum = email_num(`select * from contactinfo where email='${email}'`); console.log(emailnum); //the output presents Promise { <pending> } not a num. function sqlExecute(q) { return new Promis
var emailnum = email_num(`select * from contactinfo where email='${email}'`);
console.log(emailnum); //the output presents Promise { <pending> } not a num.
function sqlExecute(q) {
return new Promise((resolve, reject) => {
db.pool.query(q, function(err, result) {
if (err) {
console.log("ERROR ON " + q+"\n");
reject(err)
}
console.log("SUCCESS ON " + q);
resolve(result);
})
})
.catch(err => {
console.log(err);
})
}
//run check sql
async function email_num(tempquery){
var result = await sqlExecute(tempquery);
return result.rowCount;
}
首先,最好使用预先准备好的语句 此外,您应该只关心计数,因此,不要使用
选择*
,而是使用选择计数(*)作为计数。然后需要检查result
返回的行数或行的第一个索引,然后检查该行的count
属性
应该是这样的
function fetchEmailExists(email) {
const statement = 'select count(*) as count from contactinfo where email = $1';
return new Promise((resolve, reject) => {
db.pool.query(statement, [ email ], function(error, result) {
if (!error && result.rows.length > 0) {
resolve(result.rows[0]['count'] > 0);
} else {
reject(error);
}
});
})
.catch(error => {
console.log(error);
});
}
// Here is your call to fetchEmailExists
fetchEmailExists('test123@example.com')
.then(boolean => console.log(boolean));
这里的问题是,您不允许在尝试检索行计数之前解析承诺。使用async
创建函数时,返回的结果总是一个承诺。以下是一些解决方案,可帮助您获得理想的结果:
解决方案1:解决承诺后,使用console.log
打印承诺的结果
const email = 'something@gmail.com'
const numOfEmailsQuery = `SELECT * FROM contactinfo WHERE email = '${email}'`
email_num(numOfEmailsQuery)
.then(console.log)
.catch(console.error)
解决方案2:在async
函数中使用wait
解析承诺的结果并将其存储在变量中。然后使用console.log打印结果
async function printNumberOfEmails(email) {
const numOfEmailsQuery = `SELECT * FROM contactinfo WHERE email = '${email}'`
try {
const numOfEmails = await email_num(numOfEmailsQuery)
console.log(numOfEmails)
} catch (err) {
console.error(err)
}
}
const email = 'something@gmail.com'
printNumberOfEmails(email)
希望有帮助!祝你好运 非常感谢你的回答!我尝试了两种解决方案,但仍然给我承诺{}。我想重试解决方案2,它不需要返回电子邮件?非常感谢您的回答!我尝试了使用新查询的函数,当I console.log时,它仍然给我承诺{}。无论您在哪里调用fetchEmailExists,都必须调用承诺。
async function printNumberOfEmails(email) {
const numOfEmailsQuery = `SELECT * FROM contactinfo WHERE email = '${email}'`
try {
const numOfEmails = await email_num(numOfEmailsQuery)
console.log(numOfEmails)
} catch (err) {
console.error(err)
}
}
const email = 'something@gmail.com'
printNumberOfEmails(email)