IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

NodeJS Discussion :

Mongoose save rate et lance le callback sans erreur


Sujet :

NodeJS

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 37
    Par défaut 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Par défaut
    Salut,
    je ne connais pas Mongoose (et ne souhaite pas le connaitre) ...
    Mais tu gère mal tes erreurs, avec le module async tu es censé transmettre les erreurs par l’argument de la callback, utilise :
    a la place de En adoptant un modèle de programmation asynchrone (model quasi obligatoire avec NodeJS ), tu oublieras bien vite les mots clefs throw et return

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 37
    Par défaut
    Je pensais que throw permettait d'aller directement dans la méthode de callback... Merci pour tes conseils.

    Malheureusement ceci ne règle pas mon problème de voir ma base de données non remplie comme il le faudrait...

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    311
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 311
    Par défaut
    Citation Envoyé par TLOH45
    Je pensais que throw permettait d'aller directement dans la méthode de callback...
    Comment, le module async, pourrait-il intercepter une exception levée dans une Callback passé au module Mangoose ?
    Une exception levée par throw remonte la pile d’appel des fonctions, et celle-ci diffère de l’encapsulation de tes fonctions dans le code.

    Citation Envoyé par TLOH45
    Malheureusement ceci ne règle pas mon problème de voir ma base de données non remplie comme il le faudrait...
    Cela devrait stopper ton enregistrement dès la 1ere erreur !
    tu obtiendrais beaucoup plus d’aide si tu poster l’erreur que tu reçois dans la callback de la fonction Save .

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/05/2010, 14h15
  2. Macro qui se lance toute seule, sans mon autorisation
    Par csempere dans le forum VBA Word
    Réponses: 5
    Dernier message: 06/06/2009, 09h10
  3. Popupmenu et callbacks (sans GUIDE)
    Par pwfsic dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 08/06/2007, 17h31
  4. Récupérer le hwnd d'une fenetre lancé avec shellexecute sans les API?
    Par morgan47 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 06/09/2006, 19h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo