【问题标题】:Lambda error "TypeError: 'str' object does not support item assignment Traceback"Lambda 错误“TypeError:'str' 对象不支持项目分配 Traceback”
【发布时间】:2021-02-16 00:20:35
【问题描述】:

我正在尝试

import json
import uuid
import boto3

def lambda_handler(event, context):
    
    dynamo_client = boto3.resource('dynamodb')
    loadeo_carrier_company = dynamo_client.Table('loadeo_carrier_company')
    
    
    item = {}
    item = event['body']
    print(item)
    item['company_id'] = str(uuid.uuid4())
    
    print (type(item))
    try:
        loadeo_carrier_company.put_item(
          
            Item=item
        )
        return {
            "statusCode": 200,
            "headers" : {
                "Access-Control-Allow-Origin" : "*"
            },
            "message": json.dumps("Record has been inserted"),
            "body": item
        }
    except Exception as e:
            return {
                "statusCode": 500,
                "headers" : {
                    "Access-Control-Allow-Origin" : "*"
                },
                "message": "Error: Unable to save record!"
            }
    

这段代码。

当我通过 Lambda 测试事件对其进行测试时,它工作正常。 但是当我创建一个 API 并使用 postman 尝试它时显​​示内部服务器错误但是当我查看云监视日志时显示以下错误。

    [ERROR] TypeError: 'str' object does not support item assignment
Traceback (most recent call last):
  File "/var/task/lambda_function.py", line 19, in lambda_handler
    item['company_id'] = str(uuid.uuid4())

注意: Lambda 测试事件运行良好。

"body": {
  "company_name" : "waveaxis pvt ltd",
  "mc_number" : "00000",
  "email_adderess": "waveaxis@waveaxis.co.in",
  "phone_number" : "+91 1234567890",
  "company_address" : "Kormangala, Bengaluru"

},

尝试答案后:

当我从 lambda 测试事件中测试它时:

   {
  "errorMessage": "the JSON object must be str, bytes or bytearray, not dict",
  "errorType": "TypeError",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 17, in lambda_handler\n    item = json.loads(event['body'])\n",
    "  File \"/var/lang/lib/python3.8/json/__init__.py\", line 341, in loads\n    raise TypeError(f'the JSON object must be str, bytes or bytearray, '\n"
  ]
}

当我从邮递员那里打电话时。 在没有错误的try块之前执行停止

编辑 2:打印事件的 json

{
   "resource":"/",
   "path":"/",
   "httpMethod":"PUT",
   "headers":{
      "Accept":"*/*",
      "Accept-Encoding":"gzip, deflate, br",
      "Authorization":"Bearer eyJraWQiOiJCUUl6ZkxcL1VOdm9QTDVxNExlWGFRNXNxOG1mVmhmXC9rK3ZJUDdYc0p0VjQ9IiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJkYjdkODBmOC1mY2VhLTQwYjItYTZhYi1jMjhhNTZiMTI1NDIiLCJ0b2tlbl91c2UiOiJhY2Nlc3MiLCJzY29wZSI6ImNhcnJpZXJcL3JlYWQgY2FycmllclwvdXBkYXRlIGNhcnJpZXJcL2RlbGV0ZSIsImF1dGhfdGltZSI6MTYwMjA0NDQ5NywiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tXC91cy1lYXN0LTFfWW5nVnJxYUFGIiwiZXhwIjoxNjAyMDQ4MDk3LCJpYXQiOjE2MDIwNDQ0OTcsInZlcnNpb24iOjIsImp0aSI6ImExMzg4ZGUyLTRhZWQtNGI2MC04YjM0LWYzN2I1N2RjM2ZmMiIsImNsaWVudF9pZCI6IjVlZzU1NWhpNzAwZ21lbWc3N3B0NWkzbDIyIiwidXNlcm5hbWUiOiJHb29nbGVfMTEyNjUyMTUzMDI4OTQyNjAzNDM5In0.XMy9GP03o5EYrcLtQFzrMV6KID4IlDI_n0WrHa8osY_7CeeDjaCjH6Dtr766TAommLUzcLoKt-NrBUdq0Zfx-BL919j25rwiZXJbHiZP_4y9n891ddOXfPabO7n8O84-63W6l13QEBozuc21vXi7vuE_dSJ7KAgute46KP3LyoS73WPDhYim_7HZJO8pVedk64hhGNZsYWv6VU5QeQyqPl926spA25ZBo_z5dcoBnMZ_i2n5nz6qxRcINOKfMXL1f4_nDRbtKb5Pd33hKnsKYLkxEI0mrT1JKPJhkJRg9vGqaKcd13oqrigJRFSXYuVQuKNDluc38KbQJcwUoXDjjA",
      "Content-Type":"application/json",
      "Host":"661ny3iw92.execute-api.us-east-2.amazonaws.com",
      "Postman-Token":"654cfdd0-8080-48a5-8758-3aa7e5bcefcc",
      "User-Agent":"PostmanRuntime/7.26.5",
      "X-Amzn-Trace-Id":"Root=1-5fa13860-63da2718701bf3fc458c78e1",
      "X-Forwarded-For":"157.49.141.105",
      "X-Forwarded-Port":"443",
      "X-Forwarded-Proto":"https"
   },
   "multiValueHeaders":{
      "Accept":[
         "*/*"
      ],
      "Accept-Encoding":[
         "gzip, deflate, br"
      ],
      "Authorization":[
         "Bearer eyJraWQiOiJCUUl6ZkxcL1VOdm9QTDVxNExlWGFRNXNxOG1mVmhmXC9rK3ZJUDdYc0p0VjQ9IiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiJkYjdkODBmOC1mY2VhLTQwYjItYTZhYi1jMjhhNTZiMTI1NDIiLCJ0b2tlbl91c2UiOiJhY2Nlc3MiLCJzY29wZSI6ImNhcnJpZXJcL3JlYWQgY2FycmllclwvdXBkYXRlIGNhcnJpZXJcL2RlbGV0ZSIsImF1dGhfdGltZSI6MTYwMjA0NDQ5NywiaXNzIjoiaHR0cHM6XC9cL2NvZ25pdG8taWRwLnVzLWVhc3QtMS5hbWF6b25hd3MuY29tXC91cy1lYXN0LTFfWW5nVnJxYUFGIiwiZXhwIjoxNjAyMDQ4MDk3LCJpYXQiOjE2MDIwNDQ0OTcsInZlcnNpb24iOjIsImp0aSI6ImExMzg4ZGUyLTRhZWQtNGI2MC04YjM0LWYzN2I1N2RjM2ZmMiIsImNsaWVudF9pZCI6IjVlZzU1NWhpNzAwZ21lbWc3N3B0NWkzbDIyIiwidXNlcm5hbWUiOiJHb29nbGVfMTEyNjUyMTUzMDI4OTQyNjAzNDM5In0.XMy9GP03o5EYrcLtQFzrMV6KID4IlDI_n0WrHa8osY_7CeeDjaCjH6Dtr766TAommLUzcLoKt-NrBUdq0Zfx-BL919j25rwiZXJbHiZP_4y9n891ddOXfPabO7n8O84-63W6l13QEBozuc21vXi7vuE_dSJ7KAgute46KP3LyoS73WPDhYim_7HZJO8pVedk64hhGNZsYWv6VU5QeQyqPl926spA25ZBo_z5dcoBnMZ_i2n5nz6qxRcINOKfMXL1f4_nDRbtKb5Pd33hKnsKYLkxEI0mrT1JKPJhkJRg9vGqaKcd13oqrigJRFSXYuVQuKNDluc38KbQJcwUoXDjjA"
      ],
      "Content-Type":[
         "application/json"
      ],
      "Host":[
         "661ny3iw92.execute-api.us-east-2.amazonaws.com"
      ],
      "Postman-Token":[
         "654cfdd0-8080-48a5-8758-3aa7e5bcefcc"
      ],
      "User-Agent":[
         "PostmanRuntime/7.26.5"
      ],
      "X-Amzn-Trace-Id":[
         "Root=1-5fa13860-63da2718701bf3fc458c78e1"
      ],
      "X-Forwarded-For":[
         "157.49.141.105"
      ],
      "X-Forwarded-Port":[
         "443"
      ],
      "X-Forwarded-Proto":[
         "https"
      ]
   },
   "queryStringParameters":"None",
   "multiValueQueryStringParameters":"None",
   "pathParameters":"None",
   "stageVariables":"None",
   "requestContext":{
      "resourceId":"529nsbfu6a",
      "resourcePath":"/",
      "httpMethod":"PUT",
      "extendedRequestId":"VbW_FFkYCYcF3PQ=",
      "requestTime":"03/Nov/2020:11:00:48 +0000",
      "path":"/dev",
      "accountId":"272075499248",
      "protocol":"HTTP/1.1",
      "stage":"dev",
      "domainPrefix":"661ny3iw92",
      "requestTimeEpoch":1604401248435,
      "requestId":"970dd9d2-9b35-45c5-b194-806060e27d10",
      "identity":{
         "cognitoIdentityPoolId":"None",
         "accountId":"None",
         "cognitoIdentityId":"None",
         "caller":"None",
         "sourceIp":"157.49.141.105",
         "principalOrgId":"None",
         "accessKey":"None",
         "cognitoAuthenticationType":"None",
         "cognitoAuthenticationProvider":"None",
         "userArn":"None",
         "userAgent":"PostmanRuntime/7.26.5",
         "user":"None"
      },
      "domainName":"661ny3iw92.execute-api.us-east-2.amazonaws.com",
      "apiId":"661ny3iw92"
   },
   "body":"{\r\n    \"company_name\": \"waveaxis pvt ltd\",\r\n    \"mc_number\": \"00000\",\r\n    \"email_adderess\": \"waveaxis@waveaxis.co.in\",\r\n    \"phone_number\": \"+91 1234567890\",\r\n    \"company_address\": \"Kormangala, Bengaluru\"\r\n}\r\n",
   "isBase64Encoded":False
}

【问题讨论】:

    标签: python-3.x amazon-web-services aws-lambda postman aws-api-gateway


    【解决方案1】:

    据我所知,您的 event['body'] 可能只是一个 json 字符串,而不是真正的 json。

    因此,而不是

    item = event['body']
    

    你可以使用

    item = json.loads(event['body'])
    

    应该将 json 字符串解析为 json 对象。

    更新

    根据event 的发布形式,您应该使用ast,而不是json

    import ast
    
    item = ast.literal_eval(event['body'])
    

    【讨论】:

    • @sumanthshetty 您是否在测试活动中运行过它?应该通过api网关有效。
    • 我把它跑完了。 API 网关仍然显示内部服务器错误
    • @sumanthshetty 你能print(event) 并在 cloudwatch 日志中检查它的结构吗?
    • 已将其添加到问题中
    • @sumanthshetty 不起作用,因为 API 网关事件和您的测试事件不同。您已将测试事件设置为与 API 网关中的事件相同的格式。顺便说一句,如果答案有帮助,我们将不胜感激。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-02
    • 1970-01-01
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2011-07-26
    相关资源
    最近更新 更多