簡體   English   中英

AWS lambda 響應錯誤:字符串索引必須是整數(文本)

[英]AWS lambda response ERROR: string indices must be integers (Textract)

我對此很陌生,並且在這個錯誤上花了 3 個星期。 我正在嘗試從 lambda function 獲取 s3 存儲桶中圖像中提取文本的響應。 我使用以下代碼成功地將圖像從我的 expo 項目上傳到存儲桶中:

try {
                const response = await fetch(data.uri);
                const blob = await response.blob();
                const assetType = 'Mobile Device';
                await Storage.put(`${username}/${assetType}/${UUID}`, blob, {
                    contentType: 'image/jpeg',
                    progressCallback,
                });
            } catch (err) {
                console.log("Error uploading file:", err);
            } 

這將調用 lambda function 來提取所需的文本

import json
import boto3
from urllib.parse import unquote_plus
import re

def lambda_handler(event, context):
    bad_chars = [';', ':', '!', "*", ']', "[" ,'"', "{" , "}" , "'",","]
    
    file_obj = event["Records"][0]
    bucketname = str(file_obj["s3"]["bucket"]["name"])
    filename = unquote_plus(str(file_obj["s3"]["object"]["key"], encoding='utf-8'))
    
    textract = boto3.client('textract', region_name='ap-south-1')
    
    print(f"Bucket: {bucketname} ::: Key: {filename}")

    response = textract.detect_document_text(
        Document={
            'S3Object': {
                "Bucket": bucketname,
                "Name": filename,
            }
        }
    )
    
    result=[]
    processedResult=""
    for item in response["Blocks"]:
        if item["BlockType"] == "WORD":
            result.append(item["Text"])
            element = item["Text"] + " "
            processedResult += element
        
    print (processedResult)    
    res=[]
    imei=""
    
    #Extracting imei number and removing the bad characters
    str_IMEI= str(re.findall('(?i)imei*?[1]*?[:]\s*\d{15}',processedResult))
    imei= str(re.findall('[^\]]+',str_IMEI))
    
    imei = str(imei.split(' ')[-1])
    
    for i in bad_chars :
        imei = imei.replace(i, '')

    if len(imei)>0 :
        res.append(str(imei))
    else:
        res.append('')
    
    #Extracting imei2 number and removing the bad characters
    str_IMEI2= str(re.findall('(?i)imei*?[2]*?[:]\s*\d{15}',processedResult))
    imei2= str(re.findall('[^\]]+',str_IMEI2)) 
    
    imei2 = str(imei2.split(' ')[-1])
    
    for i in bad_chars :
        imei2 = imei2.replace(i, '')

   
    if len(imei2)>0 :
        res.append(str(imei2))
    else:
        res.append('')

    #Extracting model number and removing the bad characters
    
    str_Model = str(re.findall('(?i)model*?[:]\s*[\w|\d|_,-|A-Za-z]+\s*[\w|\d|_,-|A-Za-z]+',processedResult)) 
    result = str(str_Model.split(' ')[-1])
    
    for bad_char in bad_chars :
        result = result.replace(bad_char, '')

    if len(result) >0 :
        res.append(result)
    else:
        res.append('')
    
    print(res)
  
    return {
        'statusCode': 200,
        #'body': JSON.stringify(result)
        'body': res
    }

然后使用 RESTapi 從 lambda 獲取響應

try{
                const targetImage = UUID + '.jpg';
                const response = await fetch(
                    'https://6mpfri01z0.execute-api.eu-west-2.amazonaws.com/dev',
                    {
                        method: 'POST',
                        headers: {
                            Accept: "application/json",
                            "Content-Type": "application/json"                            
                        },
                        body: JSON.stringify(targetImage)
                    }
                )
                const OCRBody = await response.json();
                console.log('OCRBody', OCRBody);
            } catch (err) {
                console.log("Error extracting details:", err);
            }   

但我一直收到這個錯誤

OCRBody Object {
  "errorMessage": "string indices must be integers",
  "errorType": "TypeError",
  "requestId": "8042d6f7-44de-4a54-8209-fe93ca8570ec",
  "stackTrace": Array [
    "  File \"/var/task/lambda_function.py\", line 10, in lambda_handler
    file_obj = event[\"Records\"][0]
",
  ],
}

請幫忙。

如錯誤所述,您正在嘗試使用某種鍵對字符串類型進行切片,就好像它是字典類型一樣:

>>> str_name = 'Jhon Doe'
>>> str_name['name']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: string indices must be integers

通常,此問題可能會導致您沒有在 header 中收到正確的數據。在我所有的 Lambda function 中,使用如下內容:

bucket = event['Records'][0]['s3']['bucket']['name']

大多數情況下,事件是 Python 內的有效字典,因此您在這里有兩種可能性:

選項1

在繼續之前,像

if 'Records' in event:
  if 's3' in event['Records'][0]:
    if 'bucket' in ...
      if 'name' in ...

只有當所有條件都為真時,您才應該繼續。

選項 1做一個簡單的

print(event)

並檢查您的活動,當您的 Lambda 失敗時。

這里的問題可能導致 Lambda 在 S3 object 可用之前被觸發。

您可以做的是添加一個 S3 觸發器,它會在 S3 object 上傳后自動調用 Lambda。 看這里

https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-how-to-event-types-and-destinations.html

暫無
暫無

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

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