【发布时间】:2019-10-20 04:37:53
【问题描述】:
我正在尝试将表单提交保存到 DynamoDB 表,但是,我在本地连接时遇到了问题。我目前在本地运行 DynamoDB,但稍后我想将其移回可从 Elastic Beanstalk 访问的普通 DDB 实例。
我已将dynamodb-local 下载并解压缩到一个目录中,然后运行java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
命令,确保我位于适当的目录中。当我运行命令时,我得到这个:
Initializing DynamoDB Local with the following configuration:
Port: 8000
InMemory: false
DbPath: null
SharedDb: true
shouldDelayTransientStatuses: false
CorsParams: *
此时,我尝试在app.js 中向我的 POST 端点提交表单,但在我本地运行 DynamoDB 的终端中出现此重复错误:
Jan 12, 2019 1:24:25 PM com.almworks.sqlite4java.Internal log
WARNING: [sqlite] cannot open DB[1]:
com.almworks.sqlite4java.SQLiteException: [-91] cannot load library: java.lang.UnsatisfiedLinkError: C:\cygwin64\home\Administrator\dynamodb_local_latest\DynamoDBLocal_lib\sqlite4java-win32-x64.dll: Access is denied
Jan 12, 2019 1:24:25 PM com.almworks.sqlite4java.Internal log
SEVERE: [sqlite] SQLiteQueue[shared-local-instance.db]: error running job queue
com.almworks.sqlite4java.SQLiteException: [-91] cannot load library: java.lang.UnsatisfiedLinkError: C:\cygwin64\home\Administrator\dynamodb_local_latest\DynamoDBLocal_lib\sqlite4java-win32-x64.dll: Access is denied
at com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:97)
at com.almworks.sqlite4java.SQLiteConnection.open0(SQLiteConnection.java:1441)
at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:282)
at com.almworks.sqlite4java.SQLiteConnection.open(SQLiteConnection.java:293)
at com.almworks.sqlite4java.SQLiteQueue.openConnection(SQLiteQueue.java:464)
at com.almworks.sqlite4java.SQLiteQueue.queueFunction(SQLiteQueue.java:641)
at com.almworks.sqlite4java.SQLiteQueue.runQueue(SQLiteQueue.java:623)
at com.almworks.sqlite4java.SQLiteQueue.access$000(SQLiteQueue.java:77)
at com.almworks.sqlite4java.SQLiteQueue$1.run(SQLiteQueue.java:205)
at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.UnsatisfiedLinkError: C:\cygwin64\home\Administrator\dynamodb_local_latest\DynamoDBLocal_lib\sqlite4java-win32-x64.dll: Access is denied
at java.base/java.lang.ClassLoader$NativeLibrary.load0(Native Method)
at java.base/java.lang.ClassLoader$NativeLibrary.load(Unknown Source)
at java.base/java.lang.ClassLoader$NativeLibrary.loadLibrary(Unknown Source)
at java.base/java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.base/java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.base/java.lang.Runtime.load0(Unknown Source)
at java.base/java.lang.System.load(Unknown Source)
at com.almworks.sqlite4java.Internal.tryLoadFromPath(Internal.java:340)
at com.almworks.sqlite4java.Internal.loadLibraryX(Internal.java:117)
at com.almworks.sqlite4java.SQLite.loadLibrary(SQLite.java:95)
... 9 more
在我正在运行节点工作程序集群的终端中,我从每个工作程序 (8) 收到以下错误输出,然后是 DDB 错误:
Failed to create table in DB.
{ Error: connect ECONNREFUSED 127.0.0.1:8000
at Object.exports._errnoException (util.js:1022:11)
at exports._exceptionWithHostPort (util.js:1045:20)
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1146:14)
message: 'connect ECONNREFUSED 127.0.0.1:8000',
code: 'NetworkingError',
errno: 'ECONNREFUSED',
syscall: 'connect',
address: '127.0.0.1',
port: 8000,
region: 'us-west-2',
hostname: 'localhost',
retryable: true,
time: 2019-01-12T20:31:00.742Z }
DDB Error: NetworkingError: connect ECONNREFUSED 127.0.0.1:8000
我保证我会完成这件事。这是我创建 DDB 表的代码(我将 const ddb = new AWS.DynamoDB() 作为来自 app.js 的参数传递):
const AWS = require('aws-sdk');
function createDDBTable(ddb, tableName) {
// console.log('ddb:\n',ddb);
const tableParams = {
AttributeDefinitions: [
{
AttributeName: 'email',
AttributeType: 'S'
},
{
AttributeName: 'id',
AttributeType: 'S'
}
],
KeySchema: [
{
AttributeName: 'email',
KeyType: 'HASH'
},
{
AttributeName: 'id',
KeyType: 'RANGE'
}
],
ProvisionedThroughput: {
ReadCapacityUnits: 8,
WriteCapacityUnits: 8
},
TableName: tableName,
StreamSpecification: {
StreamEnabled: false
}
};
ddb.createTable(tableParams, (err, data) => {
if(err) console.error('Failed to create table in DB.\n', err);
else console.log('Success creating table!', data);
})
}
module.exports = createDDBTable;
我不知道哪里出错了。我所有的验证和端点都可以工作,但是,当需要创建一个表时,我的代码让我在错误中磕磕绊绊。我也有一种感觉,我可能需要稍微调整一下我的options.config 文件,但我不确定如何格式化它。提前感谢您的帮助!我试图彻底解决我的问题,但如果我可以扩展其他任何内容,请告诉我。
【问题讨论】:
-
您是否尝试过仅使用 AWS CLI 进行连接?只是为了确保 dynamodb-local 正常运行并从组合中消除 SDK。
-
感谢您的建议。我尝试列出我的表,但它抛出了我在上面发布的错误(与 SQLite 相关的 Git Bash 终端错误)。似乎将问题缩小到无法执行
DynamoDBLocal_lib目录中的任何内容,但这只是我的新假设。仍在获取ERRCONREFUSED、NetworkingError。 -
我希望保留 SDK,因为我将其移回 DynamoDB 以便从 Elastic Beanstalk 进行访问。我不想承诺本地化,如果这是一个真正的问题,那么是时候转移到生产环境(制作脚本?)。仍在学习很多 AWS。
-
@Kirk 我在 GitLab CI 上运行时遇到了同样的错误,在本地工作得很好。我正在使用
dynamodb-local版本0.0.25。我已经使用child.stdout.on('data', data => console.log(data.toString()));和child.stderr.on('data', data => console.error('ERROR!', data.toString()));向子进程添加了一个监听器,但它似乎只打印配置详细信息... -
你找到解决办法了吗?
标签: node.js amazon-web-services amazon-dynamodb