Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/43.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
Javascript函数更改变量值_Javascript_Node.js_Postgresql_Function - Fatal编程技术网

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)