Mongoose save rate et lance le callback sans erreur
Bonjour,
Très intéressé par la technologie NodeJS, je réalise quelques tests de performance pour le comparer avec d'autres frameworks, Java notamment.
Pour cela, je fais des tests sur des quantité de données assez importantes. Ces données, je les crée avec Faker.js et je les insère directement dans une base MongoDB.
Mon problème est le suivant. Un fichier me permet de créer une base de données MongoDB, MySQL, et deux fichiers csv contenant tous les mêmes données.
Pour les fichiers csv et MySQL pas de soucis, mais pour Mongo environ une fois sur deux il me manque une valeur.
A la fin de mes inserts, je vérifie la quantité de documents dans Mongo et il m'affiche 999 au lieu de 1000. Je précise que c'est le premier champ qui saute à chaque fois. Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| var i=0;
var max = 1000;
var data;
var dataMysql;
async.whilst(function(){
if(i<max)
return true;
else return false;
},
function(callback){
i++;
bool=false;
var user = Faker.Helpers.userCard();
new Person(user).save(function(err, result){
if(err)throw "Insert Error";
//Ajout des données dans le fichier
else {
//Ici je crée un décalage dans le fichier pour effectuer des updates
//pour le premier champ data prend des valeurs aléatoires
if(i==1){
data=Faker.Helpers.userCard();
}
//ici j'insère dans mon fichier le nouvel id et les données de data
fs.appendFile('UserCardDB.csv', result._id+";"+data.name+";"+data.username+";", function (err) {
if(err)throw "Writting in UserCardDB Error";
else {if(bool==false){bool=true;} else callback();}
});
data=result;
}
});
//Ici insertion pour MySQL sur le même principe
},
function(err){
if(err)console.log(err);
else
Person.count({},function(err, count){
console.log("All insert done " + count);
//res.send(0);
});
}); |
La vérification en base de données donne le même résultat que l'affichage dans la console.
Le module qui contient la fonction async.whilst est ici [URL="https://github.com/caolan/async#whilst"]. En gros elle permet de lancer la deuxième fonction tant que la première retourne true, en cas d'erreur ou de false, elle lance la troisième méthode.
Je ne comprend pas pourquoi si l'insert ne fonctionne pas, mon fichier est bien rempli, alors que l'insertion dans le fichier est dans le callbak de la fonction save.
Merci de votre aide