Когда функция async
или Promise
выдает неперехваченную ошибку, или когда перехватчик также выбрасывает, например, с вашим
throw error;
, это означает, что Абонент функции будет сталкиваться с отклоненным Обещанием.Если вы используете await
в вызывающем абоненте, то вам также нужно будет использовать try/catch
в вызывающем абоненте, чтобы правильно отследить ошибки:
app.get('/all_users', async (req, res) => {
try {
const users = await queries.getAllUsers();
console.log(users);
} catch(e) {
// handle errors
}
});
Другой способ устранить ошибку безнеобходимость использования try/catch
в потребителе не будет throw
ошибкой в вашем catch
:
async function getAllUsers() {
let response;
try {
response = await pool.query('select * FROM users');
return response.rows;
} catch (error) {
// handle error
// do not throw anything
}
}
, но для потребителя будет сложнее узнать, когда произошла ошибка.
В этом конкретном случае конструкции async
/ await
/ try
/ catch
добавляют много синтаксического шума без особой пользы для IMO - на данный момент вы можете вместо этого использовать обычные обещания:
const getAllUsers = () => pool.query('select * FROM users')
.then(response => response.rows);
// and:
app.get('/all_users', (req, res) => {
queries.getAllUsers()
.then((users) => {
console.log(users);
})
.catch((err) => {
// handle errors
});
});
async
и await
светятся, когда у вас есть несколько .then
с, которые вы хотели бы выглядеть более плоскими в вашем коде.Если есть только один .then
, IMO, нет особого преимущества в преобразовании его в синтаксис async
/ await
.Конечно, решать только вам.