![](/img/trans.png)
[英]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.