2 回答

TA貢獻1828條經(jīng)驗 獲得超13個贊
在此代碼中,您沒有處理錯誤:
(async () => {
await db.connect()
.catch((err) => {
console.error(`Database connection error: ${err.message}`);
throw new Error(err);
});
})();
如果db.connect()拒絕,那么您的.catch()遺囑將被調(diào)用并重新拋出。這意味著await db.connect()將看到一個被拒絕的承諾,你的包裝異步函數(shù)將返回一個你沒有處理程序的被拒絕的承諾。因此,您會收到未經(jīng)處理的拒絕。
您可以使錯誤完全在您的async函數(shù)中處理,因此永遠不會返回被拒絕的承諾,或者您可以正確處理錯誤。
僅供參考,await與.catch(). 通常你使用.then()and.catch()和awaitwith try/catch。
如果您想要的所有錯誤處理都是記錄錯誤并避免警告,那么您可以更改為:
db.connect().catch((err) => {
console.error(`Database connection error: ${err.message}`);
// put any other required error handling here
});
通過刪除throw err,您可以在本地“處理”錯誤,因此沒有未處理的拒絕。你在這里唯一的拒絕被處理了。另外,請注意似乎不需要async或await因為您只是在進行函數(shù)調(diào)用并處理任何異常。
注意,設(shè)計模式:
async function foo() {
await f();
}
幾乎與以下相同:
function foo() {
return f();
}
唯一不同的地方是如果f()沒有返回承諾或同步拋出,這兩種情況都不應(yīng)該在行為正確的承諾返回 API 中發(fā)生。
因為我更喜歡最簡單的代碼表達式來實現(xiàn)你的目標,所以我寧愿不使用async/await它,除非它實際上可以幫助你使代碼更簡單。

TA貢獻1810條經(jīng)驗 獲得超5個贊
事實證明,雖然我的代碼在任何方面都不理想,但問題的真正根源是我除了匿名函數(shù)之外還從其他地方調(diào)用 db.connect() 。另一個調(diào)用沒有用于錯誤處理的 catch 塊,因此是 UnhandledPromiseRejection 警告。一旦我刪除了對 db.connect() 的重復(fù)調(diào)用,警告就消失了。
作為參考,這里是在評論/答案中的貢獻者的幫助下改進的工作代碼:
數(shù)據(jù)庫類中的方法:
async connect() {
this.pool = await mysql.createPool(this.conf);
return await this.pool.getConnection();
}
以及對它的調(diào)用:
db.connect()
.then(result => {
console.log(result)
})
.catch(err => {
console.error(`Database connection error: ${err.message}`);
});
添加回答
舉報