AWS Lambda und DynamoDB Null Response
Ich versuche, von einer Lambda-Funktion in eine DynamoDB-Tabelle zu schreiben. Wenn ich die Funktion teste, wird null zurückgegeben, ohne Fehlermeldung, und es wird nichts in die Tabelle geschrieben. Die Funktion ist unten. Ich habe bereits eine Servicerolle für diese Funktion mit einer Berechtigungsrichtlinie eingerichtet, die den Zugriff auf die Tabelle "Produkte" ermöglicht. Ich habe einige Tutorials gesehen, in denen das Erstellen einer "AWS Lambda-Anwendung" und das anschließende Erstellen der Lambda-Funktion erwähnt wurden, aber ich dachte nicht, dass dies für meine Verwendung erforderlich ist.
const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = async (event, context, callback) => {
dynamodb.putItem({
TableName: "Products",
Item: {
"sku": {S: "29574839"},
"name": {S: "Test Code"}
}
}, function(err, data) {
if (err) {
console.log(err, err.stack);
return callback(null, {
statusCode: '500',
body: err
});
} else {
return callback(null, {
statusCode: '200',
body: 'Adding to table!'
});
}
});
};
Ich habe auch versucht, den Dokumentclient zu verwenden, const docClient = new dynamodb.DocumentClient();und erhalte die Fehlermeldung: "dynamodb.DocumentClient ist kein Konstruktor".
Was vermisse ich hier? Vielen Dank!
CloudWatch-Protokolle werden angezeigt (ich habe die Anforderungs-ID entfernt): Funktionsprotokolle: START RequestId: Version: $ LATEST END RequestId: REPORT RequestId: Dauer: 491,07 ms Abgerechnete Dauer: 500 ms Speichergröße: 128 MB Maximal verwendeter Speicher: 87 MB Init. Dauer: 405,37 ms
Antworten
Da Sie einen asynchronen Handler verwenden , besteht das Problem meiner Meinung nach darin, dass Ihre Funktion abgeschlossen ist, bevor der Körper des Handlers ausgeführt werden kann.
Eine Möglichkeit , dies zu korrigieren , ist die Verwendung von Promisewie in gezeigt AWS docs . Beispielsweise:
const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = async (event, context, callback) => {
const promise = new Promise(function(resolve, reject) {
dynamodb.putItem({
TableName: "Products",
Item: {
"sku": {S: "29574839"},
"name": {S: "Test Code"}
}
}, function(err, data) {
if (err) {
console.log(err, err.stack);
return callback(null, {
statusCode: '500',
body: err
});
} else {
return callback(null, {
statusCode: '200',
body: 'Adding to table!'
});
}
});
})
return promise;
};
Die obigen Änderungen sind nur beispielhaft, daher sind wahrscheinlich noch einige Anpassungen erforderlich.