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 шт):
Возможно, вас удивляет, почему не срабатывает 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!'); // Не сработает.
}
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);
}
})();