[英]error: string indices must be integers, while unpacking request.body object from API Gateway request for a lambda function
[英]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。 看這里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.