osh*_*aps 3 protocols amazon-web-services node.js amazon-dynamodb aws-sdk
我正在使用dynamoDB来保存Web服务正在生成的数据.我有时(它不一致)得到'EPROTO'错误,我读到它并且这是一个协议错误,但我使用aws-sdk(javascript)并且我没有说明任何与协议相关的细节.
这是我初始化它的方式:
var aws = require('aws-sdk');
var dynamoDB = new aws.DynamoDB({
accessKeyId: config.DynamoDB.accessKeyId,
secretAccessKey: config.DynamoDB.secretAccessKey,
region: config.DynamoDB.region
});
Run Code Online (Sandbox Code Playgroud)
我只是使用put api:
dynamoDB.putItem(params, function(err, dat) {
if (err) {
console.log('ERROR: Putting to dynamo failed with error: ' + err.message);
}
else {
console.log('wipi');
//passing data
}
});
Run Code Online (Sandbox Code Playgroud)
params 如下:
var params = {
TableName: config.DynamoDB.tableNames.data, //this is the table name, a string
Item: {
id: {
S: id // this is a generated uid (also a string)
},
scheme: {
S: ivd.version // this is a string of structure 'X.X.X'
},
data: {
S: JSON.stringify(data.data) // data.data is a big object - {arg1: [1, 2, 3...], arg2: '', ...}
}
}
};
Run Code Online (Sandbox Code Playgroud)
我应该提一下,它在同一个params对象上是不一致的(只有生成的uid才有所不同).
任何想法这个错误在我的情况下意味着什么,为什么会发生?
在https://github.com/aws/aws-sdk-js/issues/862讨论之后:
DynamoDB方面似乎存在不一致的问题,即TLS DynamoDB的哪个版本用于在客户端进行通信.要解决此问题,您需要强制SDK使用TLS v1:
const https = require('https');
const dynamodb = new AWS.DynamoDB({
region: 'us-east-1',
httpOptions: {
agent: new https.Agent({
ciphers: 'ALL',
secureProtocol: 'TLSv1_method'
})
}
});
const dynamodbDoc = new AWS.DynamoDB.DocumentClient({
region: 'us-east-1',
service: dynamodb
});
Run Code Online (Sandbox Code Playgroud)