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? P> éditer: avec aide, mon code async est comme ceci: p> < Pré> xxx pré> merci pour votre aide! p> p>
3 Réponses :
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: Vous pouvez également essayer d'utiliser let code> lors de la définition des paramètres code> comme ça va avoir le Portée ou utilisation correcte
.foreseach code> pour créer une fermeture. p> p>
Ç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.
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: P>
Ceci permet un mécanisme async / attendre de traiter avec le code ASYNC. p> Presque toutes les méthodes AWS ont cette variante renvoyant un retirez les rappels de ce que ce soit. p> Fermer le gestionnaire entier dans un Exporter.Handler = ASYNC Fonction < / code> p>
attendre documentClient.put (params) .Pomise (); code> p>
prometteur code> au lieu d'utiliser un rappel.
attendre code> Syntaxe Attendez un résultat de la promesse de manière synchrone. p>
Essayez / attraper p> p> p>
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 code> avant
s3.getObject code> appel comme je l'ai écrit.
Je suis tellement muet! Merci beaucoup
Deux choses que j'ai remarquées
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 }) }); };
Essayez d'utiliser ES6 autant que possible. Pouvez-vous s'il vous plaît vérifier le nom de la table que vous obtenez?