0
votes

Pourquoi mon code ne met rien dans ma table?

J'ai essayé d'importer des données à partir d'un fichier CSV stocké dans S3 et de mettre les données dans la table DynamAdb. Dans ma fonction Lambda qui est à Node.js, tout fonctionne bien, mes données sont bien exportées.

J'ai essayé de voir si c'était un problème avec mon article, je mets donc les paramètres var au début de la fonction ( avant le S3.getobjet) et que les données ont été placées dans ma table Dynamodb. En outre, j'ai essayé de voir si mon problème était mon si, mais pas de console.log fonctionne bien dans le si. Je pense que le seul problème est mon code, et je pense que c'est un problème d'étendue? xxx

éditer: avec aide, mon code async est comme ceci: < Pré> xxx

merci pour votre aide!


1 commentaires

Essayez d'utiliser ES6 autant que possible. Pouvez-vous s'il vous plaît vérifier le nom de la table que vous obtenez?


3 Réponses :


0
votes

Vous avez raison, c'est un problème d'étendue, car vous appelez une fonction ASYNC dans A pour boucle. Vous pouvez le réécrire comme ça, je crois: xxx

Vous pouvez également essayer d'utiliser let lors de la définition des paramètres comme ça va avoir le Portée ou utilisation correcte .foreseach pour créer une fermeture.


2 commentaires

Ça ne marche toujours pas, mais tu as raison, le problème est une boucle, mais je ne comprends pas pourquoi


Je pense avoir une erreur dans le code et j'ai fait une solution à ma réponse ci-dessus. J'inclus également certaines alternatives à la première solution de fermeture.



1
votes

Vous appelez en réalité le rappel de Handler lorsqu'un premier résultat de vente vient, ce qui entraîne la fin immédiate du processus.

Essayez ces modifications:

Exporter.Handler = ASYNC Fonction < / code>

Ceci permet un mécanisme async / attendre de traiter avec le code ASYNC.

attendre documentClient.put (params) .Pomise ();

Presque toutes les méthodes AWS ont cette variante renvoyant un prometteur au lieu d'utiliser un rappel. attendre Syntaxe Attendez un résultat de la promesse de manière synchrone. xxx

retirez les rappels de ce que ce soit.

Fermer le gestionnaire entier dans un Essayez / attraper


3 commentaires

Merci de votre réponse, mais si je le fais de cette façon, je ne peux pas mettre à ma variable de matafile afin que mon code ne fonctionne pas, je ne connais pas la fonction Async, alors je pense que je ne l'ai pas fait bien


Dans votre code édité, vous avez oublié de mettre attendre avant s3.getObject appel comme je l'ai écrit.


Je suis tellement muet! Merci beaucoup



0
votes

Deux choses que j'ai remarquées

  • Vous appelez Callback dans une boucle, pour chaque ligne de chaque ligne li>
  • vous appelez mettre avec les mêmes paramètres li> ul>

    Vous devez utiliser un package comme "async" p>

    p>

    var AWS = require("aws-sdk"),
    	documentClient = new AWS.DynamoDB.DocumentClient(); 
    var s3 = new AWS.S3();
    var async = require("async")
    
    exports.handler = function(event, context, callback) {
    	var src_bkt = event.Records[0].s3.bucket.name;
    	var src_key = event.Records[0].s3.object.key;
    	var file;
    	var lignea;
    	
    	// Retrieve the object
    	s3.getObject({
    		Bucket: src_bkt,
    		Key: src_key
    	}, function(err, dataFile) {
    		if (err) {
    			console.log(err, err.stack);
    			return callback(err);
    		} 
    
    		var things_to_insert = []
    
    		file = dataFile.Body.toString('ascii');
    		var rows = file.split('\n');
    		for(var i in rows){
    			lignea = rows[i].split(';');
    			if(lignea[2].startsWith('/France/Toulouse/')){
    				console.log("hey");
    				var params = {
    					Item : {
    						"ASSETTAG" : lignea[0], // this must be your partition key
    						"MAINHOST" : lignea[1]  // this must be your sort key
    					},
    					TableName : process.env.TABLE_NAME
    				};
    				things_to_insert.push(params)
    			}
    		}
    
    		async.forEachOf(things_to_insert, function(params, key, cb ) {
    			documentClient.put(params, function(err, data){
    				cb(err, data);
    			});
    		}, function(err) {
    			callback(err) // called only once at the end 
    		})
    	});
    };


0 commentaires