2015-04-10 2 views
6

Ich habe eine lokale dynamo-db ausgeführt. Ich habe meine Tabellen mit der JavaScript-Konsole eingerichtet und sie listet OK von dort auf.Dynamo Local von Node-aws: alle Operationen fehlgeschlagen "Operationen auf einer nicht vorhandenen Tabelle können nicht ausgeführt werden"

Ich kann auch Artikel auf meine Tabellen aus der JavaScript-Konsole setzen und erhalten:

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)); 
}); 

druckt put : err was null and data is {} die ich gehe davon ist „Erfolg“, weil

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)); 
}); 

druckt get : err was null and data is {"Item":{"environmentId":{"S":"a4fe1736-98cf-45e0-bcf4-cc927730dd1b"}}} dh es ruft das Objekt, das ich gerade auf den Tisch gelegt habe.

Wenn es jedoch um den Knoten REPL und Typ Feuer:

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)); 
} 

ich eine Ressource nicht gefunden Fehler:

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

Das ASW.request Objekt aus dem putCommand zurückgegeben hat die richtige Endpunkt:

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

Das gleiche passiert von meinem Node App jedoch den gleichen Code zu verbinden Der echte AWS-Hosted Dynamo funktioniert.

Antwort

14

Das Problem besteht darin, dass die JavaScript-Konsole und Ihre App verschiedene Profile (Anmeldeinformationen und Region) verwenden. Daher erstellt DynamoDB local separate Datenbankdateien für diese. Wenn Sie beim Starten der lokalen DynamoDB das Flag -sharedDb verwenden, wird eine einzelne Datenbankdatei für alle Clients freigegeben.

Vom doc:

-sharedDb — DynamoDB Local will use a single database file, instead of using separate files for each credential and region. If you specify -sharedDb, all DynamoDB Local clients will interact with the same set of tables regardless of their region and credential configuration.

+0

Dank. Die Tatsache, dass die JavaScript-Konsole eine andere db verwenden würde, war für mich in dieser Doc-Zeile überhaupt nicht klar. –

+0

Sie können einen Docker-Container mit Volumes setded verwenden - 'docker run -d -p 8000: 8000 -v/tmp/daten:/data/dwmkerr/dynamodb -dbPfad/data /' [run-amazon-dynamodb-lokal -mit-docker] (http://www.dwmkerr.com/run-amazon-dynamodb-locally-with-docker/) ** Hinweis **: Sie müssen eine * Access Key Id * auf Dynamo JS einrichten Shell an: [DynamoDB Local verliert Tabellen?] (https://forums.aws.amazon.com/message.jspa?messageID=553723) –