47

ローカルの dynamo-db を実行しています。JavaScript コンソールを使用してテーブルをセットアップしましたが、そこから OK が表示されます。

また、JavaScript コンソールからテーブルに項目を配置および取得することもできます。

var params = { TableName:"environmentId", Item: { environmentId: {"S":"a4fe1736-98cf-4560-bcf4-cc927730dd1b"} }};
dynamodb.putItem(params, function(err, data) {
    console.log("put : err was " + JSON.stringify(err) + " and data is " + JSON.stringify(data));
});

put : err was null and data is {}私が想定しているプリントは「成功」です。

params = { "Key":{"environmentId":{"S":"a4fe1736-98cf-45e0-bcf4-cc927730dd1b"}},"TableName":"environmentId"}
dynamodb.getItem(params, function(err, data) {
    console.log("get : err was " + JSON.stringify(err) + " and data is " + JSON.stringify(data));
});

つまりget : err was null and data is {"Item":{"environmentId":{"S":"a4fe1736-98cf-45e0-bcf4-cc927730dd1b"}}}、テーブルに置いたばかりのオブジェクトを取得します。

ただし、ノード REPL を起動して次のように入力する場合:

var AWS = require('aws-sdk');
AWS.config.loadFromPath("./config/credentials.js");
endpoint = new AWS.Endpoint("http://localhost:8000");
var dynamoOpts = {apiVersion: '2012-08-10', 'endpoint':endpoint};
var dynamodb = new AWS.DynamoDB(dynamoOpts);
var params = { TableName:"environmentId", Item: { environmentId: {"S":"a4fe1736-98cf-4560-bcf4-cc927730dd1b"} }};
dynamodb.putItem(params, function(err, data) {
    console.log("put : err was " + JSON.stringify(err) + " and data is " + JSON.stringify(data));
}

リソースが見つからないというエラーが表示されます。

{ "message":"Cannot do operations on a non-existent table",
    "code":"ResourceNotFoundException",
    "time":"2015-04 10T10:01:26.319Z",
    "statusCode":400,
    "retryable":false,
    "retryDelay":0
}

putCommand から返された ASW.request オブジェクトには、正しいエンドポイントがあります。

{ protocol: 'http:',
    host: 'localhost:8000',
    port: 8000,
    hostname: 'localhost',
    pathname: '/',
    // etc.

Node アプリからも同じことが起こりますが、AWS がホストする実際の dynamo に接続する同じコードが機能します。

4

3 に答える 3

70

問題は、JavaScript コンソールとアプリが異なるプロファイル (認証情報とリージョン) を使用しているため、DynamoDB ローカルがそれらのために別々のデータベース ファイルを作成することです。ローカルの DynamoDB を開始するときに -sharedDb フラグを使用すると、単一のデータベース ファイルがすべてのクライアントで共有されます。

ドキュメントから:

-sharedDb — DynamoDB Local は、認証情報とリージョンごとに個別のファイルを使用するのではなく、単一のデータベース ファイルを使用します。-sharedDb を指定すると、すべての DynamoDB ローカル クライアントは、リージョンと認証情報の設定に関係なく、同じテーブル セットと対話します。

于 2015-04-10T11:13:44.610 に答える