繁体   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