【问题标题】:Why am I getting the error "UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'forEach' of undefined"?为什么我收到错误“UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'forEach' of undefined”?
【发布时间】:2021-06-19 16:25:13
【问题描述】:

我有一个 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)
  .....
 ....
}

gettext.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 函数返回一个承诺有关,但我似乎无法理解我该怎么做。任何帮助将不胜感激。

错误信息如下:

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)

【问题讨论】:

  • 错误来源是blocks未定义。所以forEach 循环失败了……然后,promise 也失败了。确保data['Blocks']getData() 中定义。

标签: javascript node.js amazon-web-services es6-promise amazon-textract


【解决方案1】:

无法读取属性“forEach”...

错误是说它正在尝试读取属性forEach。这意味着这个表达式:

blocks.forEach

...未定义

...这意味着 blocks 未定义。这意味着当您分配值时:

const blocks = data['Blocks']

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

因为getDataasync function,所以它返回Promise。如果函数抛出错误,并且确实抛出了错误(试图读取 undefined 值的 forEach 属性),则 promise 变为拒绝。 “UnhandledPromiseRejectionWarning”表示getData 的调用者没有处理这些拒绝。如果将await 包装在try/catch 中,则可以捕获getData 抛出的任何错误并对其执行一些有用的操作,例如发送HTTP 错误响应。

希望这可以解释错误“UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'forEach' of undefined”' 的含义。

所以为了避免错误:

  1. 为避免未处理的拒绝,请确保在调用 getData() 或任何其他异步函数时等待结果并捕获错误。如果您不这样做,那么任何预期或意外的错误都将无法处理。
  2. 为避免读取未定义值的属性,请确保您正在访问的数据实际上是您期望的格式。在这种情况下,data['Blocks'] 看起来是未定义的,因此您要么没有获得预期的数据,要么访问不正确。尝试记录 data 以查看您实际得到的结果。顺便说一句,data.Blocksdata['Blocks'] 是等效的,而且打字更少。

【讨论】:

  • 非常感谢您的全面解释。我对它抛出的错误了解很多。我从其他人那里继承了代码,但我不明白为什么它在任何地方都没有错误处理。但是,我犯的错误非常愚蠢。 bucket_name 参数实际上是从环境文件中获取的,我错误地将环境变量名称从另一个位置粘贴。
  • 喜欢这样的错误:D。很高兴你找到它。
【解决方案2】:

我不是 js 专家,但根据我的经验,UnhandledPromiseRejectionWarning 在这种情况下会出现 await,因为 await 是 Promise 处理的简短版本,但只有 resolve 部分。

即如果在 Promise 函数中抛出了一些异常,或者如果 Promise rejects,那么 await 没有处理。

我有根据的猜测是 textract.analyzeDocument() 的回调 (err, data) => {} 部分只是拒绝它。

【讨论】:

  • 你是对的,它实际上是在拒绝它,因为我给analyzeDocument() 提供了错误的参数。感谢您的帮助。
【解决方案3】:

导致错误的是一个非常愚蠢的错误。 bucket_name 变量被环境变量替换,gettext.js 和环境文件中的变量名不同。

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 2021-09-25
    • 2020-09-20
    • 1970-01-01
    • 2023-02-22
    • 2019-08-13
    • 2021-09-27
    • 1970-01-01
    • 2020-05-10
    相关资源
    最近更新 更多