web-dev-qa-db-fra.com

AWS Lambda "Processus abandonné avant de terminer la demande"

J'essaie d'appeler une méthode client DynamoDB et d'obtenir un élément de la table DynamoDB. J'utilise AWS Lambda. Cependant, je continue à recevoir le message:

"Le processus est terminé avant de terminer la demande."

J'ai augmenté le délai d'attente simplement pour être sûr, mais le temps de traitement est inférieur au délai d'attente. Aucun conseil?

console.log('Loading event');
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});

exports.handler = function(event, context) {
dynamodb.listTables(function(err, data) {
});

var params = {
    "TableName": "User",
     "Key":
        {"User Id"   : {"S":event.objectId}
    },
    "AttributesToGet"   : ["First Name","Last Name", "Latitude", "Longitude"],
    "ConsistentRead"    : true
  }


   dynamodb.getItem(params, function(response,result) {
    response.on('data', function(chunk){
    console.log(""+chunk);
    console.log("test1")
    context.done(result);
});
result.on('ready', function(data){
    console.log("test2")
    console.log("Error:" + data.error);
    console.log("ConsumedCapacityUnits:" + data.ConsumedCapacityUnits);
     context.done('Error',data);
    // ...
});
});
};
54
Rupert

Le message "Processus quitté avant de terminer la requête" signifie que la fonction Javascript s'est terminée avant d'appeler context.done (ou context.succeed, etc.). Cela signifie généralement que votre code contient une erreur.

Je ne suis pas (du tout) un expert en Javascript, donc il existe peut-être des moyens plus élégants de détecter l'erreur, mais mon approche a été de mettre un tas de console.log messages dans mon code, exécutez-le, puis consultez les journaux. Je peux généralement cibler la ligne fautive et, si je la regarde assez longtemps, je peux généralement comprendre mon erreur.

Je vois que vous avez déjà commencé à vous connecter. Que voyez-vous dans la sortie?

51
garnaat

Examinez votre consommation de mémoire (incluse dans la dernière ligne du journal). J'ai reçu le même message lorsque j'ai assigné trop peu de mémoire à ma fonction lambda.

54
linqu

J'ai utilisé callback au lieu de context.
Des exemples plus récents sur le site Web aws utilisent callback au lieu de context.

Pour compléter la demande, l’un des suivants doit être appelé:

callback(error);         // This is used when there is an error
// or
callback(null, data);    // This is used when there is a success
                         // 'data' will contain success result, like some JSON object  

Lorsque l'exécution de lambda termine la demande,
défaut d'appeler l'un des rappels ci-dessus,
vous verrez l'erreur ci-dessous:

"Le processus est terminé avant de terminer la demande."

5

Erreur dans votre code. Supprimer le dernier}); et n'utilisez pas le contexte car il existe pour la compatibilité ascendante, utilisez les rappels lors de l'exécution de node.js 4.3 et 6.1.