第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我會收到“UnhandledPromiseRejectionWarning”?

為什么我會收到“UnhandledPromiseRejectionWarning”?

三國紛爭 2021-06-29 05:12:20
我正在嘗試調(diào)用異步方法。異步方法是:async connect() {        this.pool = await mysql.createPool(this.conf);        await this.pool.getConnection().catch((err) => { throw new Error(err) });}調(diào)用這個方法的代碼是:(async () => {    await db.connect()        .catch((err) => {            console.error(`Database connection error: ${err.message}`);            throw new Error(err);        });})();但是,當(dāng) this.pool.getConnection() 中發(fā)生錯誤時,我收到以下警告:[Thu Jun 13 2019 23:10:59] [ERROR]  (node:18296) UnhandledPromiseRejectionWarning: Error: Error: Access denied for user 'root'@'localhost' (using password: YES)    at pool.getConnection.catch    at process._tickCallback[Thu Jun 13 2019 23:10:59] [ERROR]  (node:18296) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)[Thu Jun 13 2019 23:10:59] [ERROR]  (node:18296) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.閱讀了類似問題的答案后,我明白必須處理來自 Promises 的拒絕,但是我不知道我沒有正確處理這個問題的地方。this.pool.getConnection() 調(diào)用有一個 catch 塊,在那里我拋出錯誤,所以它被傳遞給匿名調(diào)用函數(shù)來處理。我已經(jīng)嘗試了此代碼的幾種變體,包括向匿名函數(shù)本身添加一個 catch 塊并在那里再次拋出錯誤,但似乎沒有任何效果,并且警告總是源自 this.pool.getConnection() 調(diào)用。我試圖實現(xiàn)的是將 connect() 方法中發(fā)生的任何錯誤傳遞給匿名函數(shù)進行處理。我哪里錯了?提前致謝。編輯:有趣的是,如果我按如下方式編寫 this.pool.getConnection() 行(catch 塊中沒有任何內(nèi)容),警告就會消失:await this.pool.getConnection().catch((err) => {});當(dāng)我嘗試在箭頭函數(shù)內(nèi)執(zhí)行任何操作時,例如將錯誤分配給變量,警告再次出現(xiàn)。
查看完整描述

2 回答

?
慕田峪7331174

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它,除非它實際上可以幫助你使代碼更簡單。


查看完整回答
反對 回復(fù) 2021-07-01
?
森欄

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}`);

  });


查看完整回答
反對 回復(fù) 2021-07-01
  • 2 回答
  • 0 關(guān)注
  • 699 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號