我有一个本地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托管发电机的相同代码可以工作。
答案 0 :(得分:31)
问题是JavaScript控制台和您的应用程序使用不同的配置文件(凭据和区域),因此DynamoDB本地将为它们创建单独的数据库文件。通过在启动本地DynamoDB时使用-sharedDb标志,将为所有客户端共享一个数据库文件。
来自doc:
-sharedDb - DynamoDB Local将使用单个数据库文件,而不是为每个凭据和区域使用单独的文件。如果你指定 -sharedDb,所有DynamoDB Local客户端都将与同一组表进行交互,无论其区域和凭据配置如何。
答案 1 :(得分:4)
正在使用the official DynamoDB Local Docker image的用户应使用此行启动它以启用sharedDb
:
docker run -p 8000:8000 amazon/dynamodb-local -jar DynamoDBLocal.jar -inMemory -sharedDb
可以在docker inspect amazon/dynamodb-local
输出中看到图像使用的原始ENTRYPOINT
和CMD
,它们是:
"Entrypoint": [
"java"
]
"Cmd": [
"-jar",
"DynamoDBLocal.jar",
"-inMemory"
]
因此,我们基本上需要复制它们并添加-sharedDb
。