簡體   English   中英

Node.js 未處理的拒絕錯誤

[英]Node.js Unhandled Rejection Error

我的代碼中出現 Unhandled Rejection 錯誤,但跟蹤不會告訴我是什么原因造成的。 我認為是webp.cwebp調用導致了問題。 當我運行代碼時,我成功轉換了圖像和日志狀態,然后遇到了未處理的拒絕。 似乎我沒有進入最后兩個.then(()塊,因為沒有從它們記錄控制台消息。

如何正確處理拒絕錯誤以避免此錯誤? 我試過在resolve()reject()語句中插入和刪除status ,但它似乎沒有修復它。

 // Download image file from Google Cloud Storage bucket.
 return file.download({ destination: tempLocalFilename })
  .catch((err) => {
    console.error('Failed to download file.', err);
    return Promise.reject(err);
  })
  .then(() => {
    console.log(`Image ${file.name} has been downloaded to ${tempLocalFilename}.`);

    // Convert PNG to webp using webp-converter.
    return new Promise( (resolve, reject) => {
        webp.cwebp(tempLocalFilename, newLocalFilename, "-q 80", status => {
             console.log(status);

             if (status === '100') {
                 resolve();
             } else {
                 reject(status);
             }
           }
         );
       });
  })
  .then(() => {
    console.log(`Image ${file.name} has been converted.`);

    // Upload the converted image back into the bucket.
    return file.bucket.upload(newLocalFilename, { destination: file.name })
      .catch((err) => {
        console.error('Failed to upload converted image.', err);
        return Promise.reject(err);
      });
  })
  .then(() => {
    console.log(`Converted image has been uploaded to ${file.name}`);

    // Delete the temporary file.
    return new Promise((resolve, reject) => {
      fs.unlink(tempLocalFilename, (err) => {
        if (err) {
          reject(err);
        } else {
          resolve();
        }
      });
    });
  });

問:我收到未處理的拒絕錯誤,我該如何正確處理拒絕錯誤?

A:就像評論已經說過的那樣, .catch(...)將阻止您的異常冒泡成為unhandled rejection error

或者,您還可以為每個.then(...)子句插入拒絕處理函數。 也就是說,對於每個.then()它應該有 2 個函數,一個用於快樂路徑,另一個用於錯誤路徑。

例如

  return new Promise( (resolve, reject) => {
        webp.cwebp(tempLocalFilename, newLocalFilename, "-q 80", status => {
             ...
           }
         );
       });
  })
  .then(/*happy path=*/() => {
    console.log(`Image ${file.name} has been converted.`);

    // Upload the converted image back into the bucket.
    return file.bucket.upload(newLocalFilename, { destination: file.name })
      .catch((err) => {
        console.error('Failed to upload converted image.', err);
        return Promise.reject(err);
      });
  },
  /*unhappy path=*/ (error) => { 
      console.log("oops something went wrong during uploading"); 
  })
  /*catch all rejection=*/
  .catch(error => {
       console.log("something bad happened somewhere, rollback!");
   });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM