Skip to main content
 首页 » 编程设计

python之格式错误的 Lambda 代理响应 : string indices must be integers

2025年05月04日9powertoolsteam

我正在尝试使用 AWS Lambda 为应用程序编写无服务器后端,但遇到了标题中的错误。使用API​​ Gateway 代理集成测试时出现错误,但在Lambda 控制台中测试功能正常。

这里是错误:

{   
   "errorMessage":"string indices must be integers", 
   "errorType":"TypeError", 
   "stackTrace":[   
      [   
         "/var/task/auth_login.py", 
         17, 
         "lambda_handler", 
         "response = get_user(payload)" 
      ], 
      [   
         "/var/task/shifty_utils/__init__.py", 
         22, 
         "get_user", 
         "table = dynamo.Table(user['company'] + '_users')" 
      ] 
   ] 
} 

这是它发生的上下文:

def lambda_handler(event, context): 
    payload = event['body'] 
    response = get_user(payload) 
 
def get_user(user): 
    try: 
        table = dynamo.Table(user['company'] + '_users') 
        response = table.get_item( 
            Key={ 
                'userId': user['userId'], 
                'position': user['position'] 
            } 
        ) 
    except ClientError as e: 
        print(e.response['Error']['Message']) 
        return {'message': e.response['Error']['Message']} 
    else: 
        return response 

基本上,代理集成似乎是将事件对象作为 JSON 格式的字符串读取,而不是字典,但如果我为此调整代码,会发生以下情况:

{   
   "errorMessage":"the JSON object must be str, bytes or bytearray, not 'dict'", 
   "errorType":"TypeError", 
   "stackTrace":[   
      [   
         "/var/task/auth_login.py", 
         15, 
         "lambda_handler", 
         "payload = json.loads(event)" 
      ], 
      [   
         "/var/lang/lib/python3.6/json/__init__.py", 
         348, 
         "loads", 
         "'not {!r}'.format(s.__class__.__name__))" 
      ] 
   ] 
} 

我赢不了。感谢您的帮助。

请您参考如下方法:

您已经确定了问题所在。但是,您正在尝试将 dict 转换为 dict。

这就是你拥有的:

json.loads(event) # event is a dict 

您正确识别的正文部分是作为 str 进入的部分。

这是你应该拥有的:

json.loads(event['body']) 

另一个步骤是使其与客户端无关。

if isinstance(event['body'], (unicode, str)): 
    body = json.loads(event['body'])