Amazon лямбда-функция не принимает сообщения - PullRequest
1 голос
/ 10 апреля 2020

Я получаю это сообщение об ошибке при тестировании моей лямбда-функции.

 {
  "errorMessage": "the JSON object must be str, bytes or bytearray, not list",
  "errorType": "TypeError",
  "stackTrace": [
    "  File \"/var/task/handler.py\", line 90, in send_friend_request\n    payload = json.loads(event['body'])\n",
    "  File \"/var/lang/lib/python3.7/json/__init__.py\", line 341, in loads\n    raise TypeError(f'the JSON object must be str, bytes or bytearray, '\n"
  ]
}

Строка, на которую он жалуется:

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

Эта функция:

def accept_friend_request(event, context):

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

    request_id = payload['request_id']
    fromUsername = payload['fromUsername']
    toUsername = payload['toUsername']

Формат отправки моего сына:

{
  "body": [
    {
      "fromUsername": "testUsrname",
      "toUsername": "testsToUsername"
    }
  ]
}

Я пробовал использовать другие форматы для отправки сына, например:

{
      "fromUsername": "testUsrname",
      "toUsername": "testsToUsername"
}

, но также выбрасывает ошибка:

{
  "errorMessage": "'body'",
  "errorType": "KeyError",
  "stackTrace": [
    "  File \"/var/task/handler.py\", line 90, in send_friend_request\n    payload = json.loads(event['body'])\n"
  ]
}

Я действительно потерян здесь, что делать. Я отправляю сына в неправильном формате или я принимаю его неправильно с json .loads?

1 Ответ

0 голосов
/ 10 апреля 2020

json.loads() получает строку в качестве параметра и преобразует ее в python объект (список / словарь).

Проблема в вашем коде в том, что event["body"] уже является python объектом (список, согласно на ошибку вы поделились). Как упомянуто в AWS Лямбда-документах для python функций обработчика событий:

event – AWS Lambda uses this parameter to pass in event data to the handler. This parameter is usually of the Python dict type. It can also be list, str, int, float, or NoneType type

Так что вам не нужно использовать json.loads(), чтобы разобрать его в python объект. Вы можете сделать:

# For the following event:
{
  "body": [
    {
      "fromUsername": "testUsrname",
      "toUsername": "testsToUsername"
    }
  ]
}

def accept_friend_request(event, context):
    request_id = context.aws_request_id
    payload = event['body']
    fromUsername = payload[0]['fromUsername']
    toUsername = payload[0]['toUsername']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...