Zug*_*dud 5 lambda node.js amazon-dynamodb
我的 DynamoDB 表具有以下分区键:
UserId String
Run Code Online (Sandbox Code Playgroud)
这是我的 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);
});
};
Run Code Online (Sandbox Code Playgroud)
当前发生的情况是,它按预期读取 S3 文件,但我无法将结果记录传递到 dynamo,云监视日志错误是它没有通过 UserId(所需的分区键)尽管如此在数据中。记录在 CloudWatch 中打印得很好,实际上,如果我替换此行上的记录变量:
Item: record,
Run Code Online (Sandbox Code Playgroud)
使用来自 CloudWatch 的 JSON 字符串,它可以按预期工作。有什么建议?
PS 我是一个 JavaScript 新手,如果这还不是很明显,但我相信问题是由于变量记录在运行时是如何被解释的,因为如果我将该变量替换为它的值作为硬编码字符串,它可以正常工作。