maikeru666
@maikeru666

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

webサイトにてdynamoDBからカラム名を除き値だけを表示したい。

解決したいこと

webサイトにてdynamoDBからカラム名を除き値だけを表示したい。

現在cloudfront,s3(静的サイト,js),apigateway,lambda,dynamoDBで簡易的なweb
サイトを構築しています。

dynamoDBのレコードを取得するとキーバリュー型?json型で取得されてしまいます。

apigateway上のpythonにてカラム名を指定しても、s3上のjsでjson型をオブジェクトにparseしてカラム名で指定しても以下のような形で返されるままになってしまいます。

発生している問題・エラー

{"dbItemsItemsresponse": [{"input_text": "こんにちは", "output_text": "Hello", "timestamp": "datetime"},

すごく基本的なことであり、dynamoDBを使用して同じように構築する人は多いはずですが調べてもうまくいきません。
上記のようなアーキテクチャであった場合、どのようにdynamoDBからキー?を排除し、値だけ取ってきているのでしょうか。

もしくはDBをmysqlにするとapiで返ってくるものをカラムで指定し、値だけをwebサイトに表示出来るのでしょうか。(戻り値がオブジェクト型になる?)

s3のjsにてresponseをparseしたもの

function func1() {
  var apiurl = 'https://' + document.domain + '/api?input_text=' + document.getElementById("input_message").value;
  var request = new XMLHttpRequest();
  

  request.open('GET', apiurl, true);
  request.responseType = 'text';
  request.onload = function () {
      var data = json.parse(this.response);
      
      document.getElementById("output_message").innerHTML = data['dbItemsItemsresponse'];
  };
  request.send();
}

lambdaでdynamoDBから値を取ってくる時にカラム名で指定したもの。ProjectionExpressionでカラム指定(input_type)しても、値だけでなくそのカラム名までデータを取ってきてしまいます。({input_text:値}という形で)

 get_item = dynamodb_translate_history_tbl.scan(ProjectionExpression='input_text')
    
    
    dbItemsItemsresponse = get_item['Items']
    
    
    #bodys = [output_text ,dbresponse]

    return {
        'statusCode': 200,
        'body':json.dumps({'dbItemsItemsresponse' : dbItemsItemsresponse}),
        
        'isBase64Encoded': False,
        'headers': {}
        
    }    
end
0

1Answer

Comments

  1. @maikeru666

    Questioner

    だめでした、ありがとうございます。どうやらcloudfrontでjsがキャッシュされており、キャッシュを無くしてみると今度parseすると値が返ってこなくなってしまいました、

    ちなみにmySQLにすると問題ないのでしょうか、
    しかし、値一つもしくは、複数の場合はjson形式にしないとapigatewayが通過出来ず、jsでparseするしかないのでしょうか、

  2. 読解力がなく認識違いがあったらすみません。
    最終的にどの値が欲しいのかはわかりませんが、以下のようにすることで、jsonではなくプレーンテキストでinput_textの値だけを表示できるのではと思います。

    get_item = dynamodb_translate_history_tbl.scan(ProjectionExpression='input_text')
    
    dbItemsItemsresponse = get_item['Items']
    
    # 'input_text' の値だけを取得して改行で結合
    input_texts = '\n'.join(item['input_text'] for item in dbItemsItemsresponse)
    
    return {
        'statusCode': 200,
        'body': input_texts,  # プレーンテキストとして値を返す
        'isBase64Encoded': False,
        'headers': {
            'Content-Type': 'text/plain'  # ヘッダーにコンテンツタイプを設定
        }
    }
    
    function func1() {
      var apiurl = 'https://' + document.domain + '/api?input_text=' + document.getElementById("input_message").value;
      var request = new XMLHttpRequest();
      
      request.open('GET', apiurl, true);
      request.responseType = 'text';  // レスポンスタイプはテキスト
      request.onload = function () {
          var data = this.responseText;  // レスポンスをテキストとして取得
          
          // プレーンテキストをそのまま出力エリアに設定
          document.getElementById("output_message").innerHTML = data;
      };
      request.send();
    }
    
  3. @maikeru666

    Questioner

    ご返信遅れてしまい申し訳ありません、共有頂いたコードで解決出来ました。
    調べても分からなかったので、ご丁寧に誠にありがとうございます。

Your answer might help someone💌