我正在尝试使用 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'])
