В этом коде вы не обрабатываете ошибку:
(async () => {
await db.connect()
.catch((err) => {
console.error(`Database connection error: ${err.message}`);
throw new Error(err);
});
})();
Если db.connect()
отвергает, вам будет вызван ваш .catch()
и он будет сброшен. Это означает, что await db.connect()
увидит отклоненное обещание, а ваша асинхронная функция-оболочка вернет отклоненное обещание, для которого у вас нет обработчика. Таким образом, вы получаете необоснованный отказ.
Вы можете сделать так, чтобы ошибка полностью обрабатывалась в вашей функции async
и, следовательно, никогда не возвращала отклоненное обещание или вы можете обработать ошибку должным образом.
К вашему сведению, также странно (и вообще не рекомендуется) смешивать await
с .catch()
. Обычно вы используете .then()
и .catch()
вместе и await
с try/catch
.
Если все, что вам нужно для обработки ошибок, это регистрировать ошибку и избегать предупреждения, тогда вы можете изменить это на:
db.connect().catch((err) => {
console.error(`Database connection error: ${err.message}`);
// put any other required error handling here
});
Удаляя throw err
, вы «обрабатываете» ошибку локально и, таким образом, нет необработанного отклонения. Единственный отказ, который у вас есть, обрабатывается. Кроме того, обратите внимание, что, похоже, нет необходимости в async
или await
, поскольку вы просто делаете вызов функции и обрабатываете любое исключение.
Обратите внимание, шаблон дизайна:
async function foo() {
await f();
}
почти так же, как:
function foo() {
return f();
}
Единственное место, где это будет отличаться, это если f()
не вернул обещание или не выполнил синхронно, оба из которых никогда не должны происходить в должным образом управляемом API, возвращающем обещание.
Поскольку я предпочитаю самое простое выражение кода, которое достигает ваших целей, я предпочитаю не использовать async/await
, за исключением случаев, когда это действительно помогает вам сделать код проще.