簡體   English   中英

為什么我收到錯誤“UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'forEach' of undefined”?

[英]Why am I getting the error “UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'forEach' of undefined”?

我有一個 index.js、gettext.js 和 extract.js。

index.js

app.post("/anaData", async function(req, res) {
  const someData = await docExtract(req.body['file_name'])
  const data = await getData(someData)
  .....
 ....
}

獲取文本.js

async function docExtract (file_name) {
  return new Promise(resolve => {
     var file_params = {
       Document: {
         S3Object: {
           Bucket: bucket_name,
           Name: filename
         }
       },
       FeatureTypes: ['TABLES'],
     }
     
     textract.analyzeDocument(file_params, (err, data) => {
       if (err) {
         return resolve(err)
       } else {
         resolve(data)
       }
     })
   })
 }
 module.exports = docExtract

extract.js

async function getData(data) {
    const blocks = data['Blocks']
  
    const blocksMap = {}
    const tableBlocks = []
  
    blocks.forEach(block => {  //At this point the error is generated: TypeError: Cannot read property 'forEach' of undefined"
      blocksMap[block['Id']] = block
  ....
....
}
  module.exports = getData

我正在發送正確的 json 數據。 我檢查了 req.body['file_name'] 是否可以訪問。 問題似乎與 docExtract function 返回 promise 的事實有關,但我似乎無法理解我該怎么做。 任何幫助將不勝感激。

錯誤消息如下:

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'forEach' of undefined
    at extract (path\to\getData.js:75:12)
    at path\to\index.js:28:22
    at processTicksAndRejections (internal/process/task_queues.js:97:5)

無法讀取屬性“forEach”...

錯誤是說它正在嘗試讀取屬性forEach 這意味着這個表達式:

blocks.forEach

...未定義的

...這意味着blocks是未定義的。 這意味着當您分配值時:

const blocks = data['Blocks']

... data['Blocks']的值為undefined

因為getData是一個async function ,所以它返回一個Promise 如果 function 拋出錯誤,並且它確實(嘗試讀取undefined值的forEach屬性),則 promise 將變為拒絕。 “UnhandledPromiseRejectionWarning”表示getData的調用者沒有處理這些拒絕。 如果將await包裝在try/catch中,則可以捕獲getData拋出的任何錯誤並對其執行一些有用的操作,例如發送 HTTP 錯誤響應。

因此,希望這可以解釋錯誤“UnhandledPromiseRejectionWarning:TypeError:無法讀取未定義的屬性'forEach'”的含義。

所以為了避免錯誤:

  1. 為避免未處理的拒絕,請確保在調用getData()或任何其他異步 function 時等待結果並捕獲錯誤。 如果您不這樣做,那么任何預期或意外的錯誤都將無法處理。
  2. 為避免讀取未定義值的屬性,請確保您正在訪問的數據實際上是您期望的格式。 在這種情況下,看起來data['Blocks']是未定義的,因此您要么沒有獲得預期的數據,要么訪問不正確。 嘗試記錄data以查看您實際得到的結果。 順便說一句, data.Blocksdata['Blocks']等效且鍵入更少。

我不是 js 專家,但根據我的經驗, UnhandledPromiseRejectionWarning在這種情況下會發生await ,因為await是 promise 處理的簡短版本,但只是resolve部分。

即,如果在 promise function 中拋出一些異常,或者如果 promise reject s,則await不會處理。

我有根據的猜測是textract.analyzeDocument()的回調(err, data) => {}部分只是拒絕它。

這是一個非常愚蠢的錯誤導致了錯誤。 bucket_name 變量被環境變量替換,gettext.js 和環境文件中的變量名不同。

暫無
暫無

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

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