【发布时间】:2017-07-02 21:20:29
【问题描述】:
我的 DynamoDB 表具有以下分区键:
UserId String
这是我的 Lambda 函数:
'use strict';
console.log('Loading function');
const doc = require('dynamodb-doc');
const dynamo = new doc.DynamoDB();
var AWS = require('aws-sdk');
var S3 = new AWS.S3({
maxRetries: 0,
region: 'us-east-1',
});
var insertSuccess = 0;
var insertErrors = 0;
function dynamoResultCallback(err, data) {
if (err) {
insertErrors++;
console.log("Insert Error: \n");
console.log(err, err.stack); // an error occurred
} else {
insertSuccess++;
}
}
exports.handler = (event, context, callback) => {
console.log('Received event:', JSON.stringify(event, null, 2));
console.log("Init complete, running.. \n")
var srcBucket = event.Records[0].s3.bucket.name;
var srcKey = event.Records[0].s3.object.key;
console.log("Params: srcBucket: " + srcBucket + " srcKey: " + srcKey + "\n")
S3.getObject({
Bucket: srcBucket,
Key: srcKey,
}, function(err, data) {
if (err !== null) {
return callback(err, null);
}
var fileData = data.Body.toString('utf-8');
var recordsArray = fileData.split("\n");
for (var i = 0; i < recordsArray.length; i++) {
var record = recordsArray[i];
console.log("Inserting record: " + record);
var params = {
Item: record,
ReturnConsumedCapacity: "TOTAL",
TableName: "PacketData"
};
dynamo.putItem(params, dynamoResultCallback);
}
console.log("Insert Result -- successCount: " + insertSuccess + " errorCount: " + insertErrors)
return callback(null, data);
});
};
目前发生的情况是,它按预期读取 S3 文件,但我无法将结果记录传递到 dynamo,云监视日志错误是它没有传递 UserId(所需的分区键) 尽管它在数据中。记录在 CloudWatch 中打印良好,实际上如果我在这一行替换记录变量:
Item: record,
使用来自 CloudWatch 的 JSON 字符串,它可以按预期工作。有什么建议?
附:如果这还不明显,我是 JavaScript 新手,但我认为问题在于变量 record 在运行时如何被解释,因为如果我用它的值替换该变量它工作正常作为硬编码字符串。
【问题讨论】:
-
你能试试 JSON.parse(record);将记录字符串转换为对象?
-
啊,是的,这就是问题所在,JSON.parse(record) 修复了它。谢谢!
标签: node.js lambda amazon-dynamodb