Nodejs ругается на throw

try {
    ClientDB.query(querySelectUser, (queryError, queryResponse) => {
        if (queryError) {
            throw new Error('Ошибка сервера');
        }

        if (!queryResponse.rows[0]) throw new Error('ВОТ ТУТ!');

        const passwordDB = queryResponse.rows[0].password;

        if (passwordHash === passwordDB) {
            response
                .status(200);
        } else {
            throw new Error('Не верный пароль');
        }
    });
} catch (error) {
    console.log(error.message);
}

Node выкидывает ошибку на throw, почему понять не могу. Вставлял в разных участках такое условие. Без условия вставлял, все равно ругается.

D:\pets\debtor-back\functions\app\auth\authorization.js:17
                    if (!queryResponse.rows[0]) throw new Error('ВОТ ТУТ!');
                                                ^

Так и не разобрался почему нода ругается. Из комментариев ниже, переделал на промис и вызываю ошибки через reject()

const authorizationQuery = (email, password) => {
  const querySelectUser = `SELECT email, password FROM ${ DB_TABLES.users } WHERE email='${ email }'`;

  return new Promise(((resolve, reject) => {
    ClientDB.query(querySelectUser, (queryError, queryResponse) => {
        if (queryError) return reject(new Error('Ошибка сервера'));
        if (!queryResponse.rows.length) return reject(new Error('Email не зарегестрирован'));

        const user = queryResponse.rows[0];
        if (user.password !== password) return reject(new Error('Пароль не верный'));

        return resolve(user);
      });
  }));
};

const authorization = async (request, response) => {
  const { email, password } = request.body;
  const passwordHash = createSha256(password);
  try {
      const user = await authorizationQuery(email, passwordHash);
      // TODO: добавить генерацию токенов
      response.status(200).json({status: true, data: user});
  } catch (error) {
      response.status(200).json({status: false, title: error.message});
  }
};

Ответы (2 шт):

Автор решения: vsemozhebuty

Возможно, вас удивляет, почему не срабатывает try...catch, то есть почему ошибка не ловится?

Это потому, что ошибка возникает не в том коде, который вы облекли в try...catch, а в колбеке, которые вызывается позже, когда код в try...catch уже отработал. Сравните:

try {
  throw new Error();
} catch (err) {
  console.error('Caught 1!'); // Сработает.
}


try {
  setTimeout(() => {
    throw new Error();
  }, 1000);
} catch (err) {
  console.error('Caught 2!'); // Не сработает.
}

Если вы хотите поймать ошибку в колбеке, вам нужно использовать try...catch внутри колбека:

try {
  setTimeout(() => {
    try {
      throw new Error();
    } catch (err) {
      console.error('Caught 3!'); // А тут сработает.
    }
  }, 1000);
} catch (err) {
  console.error('Caught 2!'); // Не сработает.
}

→ Ссылка
Автор решения: MoloF

function myQuery(querySelectUser) {
    return new Promise((resolve, reject) => {
        ClientDB.query(querySelectUser, (queryError, queryResponse) => {
            if (queryError) reject('Ошибка сервера');
            if (!queryResponse.rows[0]) reject('ВОТ ТУТ!');

            const passwordDB = queryResponse.rows[0].password;
            if (passwordHash !== passwordDB) reject('Не верный пароль');
            
            resolve();
        });
    });
}

(async () => {
    try {
        await myQuery({});
        console.log('Данные подтверждены');
    } catch (error) {
        console.log(error);
    }
})();

Вот явный пример использования async/await вместе с try/catch

function myQuery() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() > 0.5) reject('Рандомная ошибка');            

            resolve();
        }, 3000);
    });
}

(async () => {
    try {
        await myQuery();
        console.log('OK');
    } catch (e) {
        console.log(e);
    }
})();

→ Ссылка