我正在使用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 });
我只是使用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 } });
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: '', ...} } } };
我应该提一下,它在同一个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 });