2017-06-24 34 views
0

AWSラムダを持つアプリケーション用にサーバレスバックエンドを作成しようとしています。このエラーは、API Gatewayプロキシの統合でテストするときに発生しますが、ラムダコンソールでテストしたときに正常に機能します。ここで形式の間違ったラムダプロキシ応答:文字列インデックスは整数でなければなりません

は誤りである:ここでは

{ 
    "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__))" 
     ] 
    ] 
} 

私は勝てません。どんな助けもありがとうございます。

答えて

3

問題を特定しました。しかし、dictdictに変換しようとしています。

これは、あなたが持っているものです。

json.loads(event) # event is a dict 

体の一部あなたは正しく識別したとしてstrとして取得しているものです。

これは、あなたが持っているべきである:

json.loads(event['body']) 

もう一つのステップは、クライアントに依存しないようにすることです。

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

JSONを扱う場合、Pythonは2つのSTD機能提供:あなたがここに必要なもの

https://docs.python.org/3/library/json.html#json.dumps

Serialize obj to a JSON formatted str using this conversion table. The arguments have the same meaning as in dump().

https://docs.python.org/3/library/json.html#json.loads

Deserialize s (a str, bytes or bytearray instance containing a JSON document) to a Python object using this conversion table.

は最新のものです:

アクセスするためのit'sはあなたが拳json.loads

`経由でPythonのOBJに変換する必要があります値ので
import json 
payload = json.loads(event['body'] 

は、おそらくJSON strのです

関連する問題