web-dev-qa-db-ja.com

エラーInvalidParameterType:params.Item ['pid']がDynamoDBの構造であると予想されました

注:これらはすべて、DynamoDBのローカルインスタンスで発生しています。

これは、DynamoDBシェルからテーブルを作成するために使用したコードです。

var params = {
    TableName: "TABLE-NAME",
    KeySchema: [
        { AttributeName: "pid", 
          KeyType: "HASH"
        }
    ],
    AttributeDefinitions: [
        { AttributeName: "pid",
          AttributeType: "S"
        }
    ],
    ProvisionedThroughput: {
        ReadCapacityUnits: 1,
        WriteCapacityUnits: 1
    }
};


dynamodb.createTable(params, function(err, data) {
    if (err)
        console.log(JSON.stringify(err, null, 2));
    else
        console.log(JSON.stringify(data, null, 2));
});

これは、要素をDB(node.js内)に追加するために呼び出される関数です。

function(request, response) {
  params = {
    TableName: 'TABLE-NAME',
    Item: {
      pid: 'abc123'
    }
  };
  console.log(params);
  dynamodb.putItem(params, function(err, data) {
    if (err)
      console.log(JSON.stringify(err, null, 2));
    else
      console.log(JSON.stringify(data, null, 2));
  });
}

私が得る出力は次のとおりです。

{ TableName: 'TABLE-NAME',
  Item: { pid: 'abc123' } }   // THIS IS PARAMS
{
  "message": "There were 7 validation errors:\n* InvalidParameterType: Expected params.Item['pid'] to be a structure\n* UnexpectedParameter: Unexpected key '0' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '1' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '2' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '3' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '4' found in params.Item['pid']\n* UnexpectedParameter: Unexpected key '5' found in params.Item['pid']",
  "code": "MultipleValidationErrors",
  "errors": [
    {
      "message": "Expected params.Item['pid'] to be a structure",
      "code": "InvalidParameterType",
      "time": "2015-11-26T15:51:33.932Z"
    },
    {
      "message": "Unexpected key '0' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.933Z"
    },
    {
      "message": "Unexpected key '1' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.933Z"
    },
    {
      "message": "Unexpected key '2' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.933Z"
    },
    {
      "message": "Unexpected key '3' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.933Z"
    },
    {
      "message": "Unexpected key '4' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.934Z"
    },
    {
      "message": "Unexpected key '5' found in params.Item['pid']",
      "code": "UnexpectedParameter",
      "time": "2015-11-26T15:51:33.934Z"
    }
  ],
  "time": "2015-11-26T15:51:33.944Z"
}

前の行に印刷されていないときに、キー0、1、2、3、4、および5が表示されない理由と方法がわかりません。

また、エラーを修正するにはどうすればよいですかExpected params.Item['pid'] to be a structure?文字列として宣言し、文字列を保存しようとしています!

その他の注意:関数で使用したのと同じコードは、シェルで実行したときに正常に機能します。また、aws-sdkを含め、必要に応じて構成しました。

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
AWS.config.endpoint = 'http://localhost:8000/'
var dynamodb = new AWS.DynamoDB();
17
rohithpr

putItem()_AWS.DynamoDB_ クラスのメソッドは、_params.Item_オブジェクトがAttributeValue表現としてフォーマットされることを期待しています。つまり、これを変更する必要があります。

_params = {
  TableName: 'TABLE-NAME',
  Item: {
    pid: 'abc123'
  }
};
_

これに:

_params = {
  TableName: 'TABLE-NAME',
  Item: {
    pid: {
      S: 'abc123'
    }
  }
};
_

ネイティブjavascriptオブジェクトを使用する場合は、 _AWS.DynamoDB.DocumentClient_ クラスを使用する必要があります。このクラスは、次のようにJavascriptタイプをDynamoDB AttributeValuesに自動的にマーシャリングします。

  • 文字列-> S
  • 数-> N
  • ブール-> BOOL
  • null-> NULL
  • 配列-> L
  • オブジェクト-> M
  • バッファー、ファイル、Blob、ArrayBuffer、DataView、およびJavaScript型付き配列-> B

put() メソッドを提供し、これは AWS.DynamoDB.putItem() に委任します。

51
birnbaum

注:以下の複数のコメントで述べられているように、この回答は無効になる場合があります。

Nodejsからデータベースにレコードを追加するために使用する必要がある関数は、putであり、DynamoDBシェルで使用されるputItemではありません。上記の機能を次のように変更すると修正されました。

function(request, response) {
  params = {
    TableName: 'TABLE-NAME',
    Item: {
      pid: 'abc123'
    }
  };
  console.log(params);
  dynamodb.put(params, function(err, data) {
    if (err)
      console.log(JSON.stringify(err, null, 2));
    else
      console.log(JSON.stringify(data, null, 2));
  });
}
1
rohithpr