Javascript значение переменной изменения функции - PullRequest
0 голосов
/ 08 июля 2020

В настоящее время я разрабатываю страницу регистрации и хочу проверить, существует ли уже адрес электронной почты в базе данных.

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;
}

Я пробовал несколько способов, но все еще не мог понять. Буду признателен за любую помощь TT

, когда я использую console.log, вывод всегда будет обещать {}. Я пробовал

var emailnum = email_num(`select count(*) as count from contactinfo where email='${email}'`)
.then((val)=>{
return val
};
console.log("number"+ emailnum);

Ответы [ 2 ]

1 голос
/ 08 июля 2020

Проблема здесь в том, что вы не позволяете обещанию разрешиться до попытки получить количество строк. Когда вы создаете функцию с использованием 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 : Используйте await внутри функции async, чтобы разрешить результат обещания и сохранить его в переменной. Затем распечатайте результат, используя 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)

Надеюсь, что это поможет! Удачи!

0 голосов
/ 08 июля 2020

Во-первых, рекомендуется использовать вместо него подготовленные операторы.

Кроме того, вам следует позаботиться только о счетчике, поэтому вместо select * выполните select count(*) as count. Затем вам нужно будет проверить количество возвращенных 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));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...