[英]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'”的含義。
所以為了避免錯誤:
getData()
或任何其他異步 function 時等待結果並捕獲錯誤。 如果您不這樣做,那么任何預期或意外的錯誤都將無法處理。data['Blocks']
是未定義的,因此您要么沒有獲得預期的數據,要么訪問不正確。 嘗試記錄data
以查看您實際得到的結果。 順便說一句, data.Blocks
與data['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.