Bonjour/bonsoir,

Je viens vers vous car j'ai un petit soucis qui me dépasse.

J'utilise mongoose comme ODM pour accéder à ma base de donnée.Connect-flash pour faire m'aider dans l'affichage des erreurs pour mon formulaire. Et aussi passport/passport-local pour gérer l'inscription de mes utilisateurs.

J'ai découvert récemment le principe des promesses, et j'essaye de l'appliquer sur un exemple concret (un système d'édition de profile, seulement l'email pour le moment). Tout fonctionne parfaitement, seulement mon req.flash ne s'affiche jamais. Je vous mets çi-dessous les codes que j'ai réalisé. A noter que dans mon formulaire, j'utilise enctype="multipart/form-data" car j'ai mis en place un système d'upload d'avatar que je ne vous mets pas çi-dessous.

Mon code html :

<% if(locals.errors && locals.errors.length > 0) { %>
    <div class="alert alert-danger">
        We found some issues : 
        <% for(var i=0; i < locals.errors.length; i++) { %>
            <li> <%= locals.errors[i] %> </li>
        <% } %>                                        
     </div>
<% } %>

<% if(locals.success && locals.success.length > 0) { %>
    <div class="alert alert-success">
        Profile updated :
            <% for(var i = 0; i < locals.success.length; i++) { %>
                <li> <%= locals.success[i] %> </li>
            <% } %>
    </div>
 <% } %>

<form method="post" action="/profile/edit" enctype="multipart/form-data">

    <div class="form-group row">
        <label  for="email" class="col-2 col-form-label">Email : </label>
        <div class="col-8">
            <input type="email" class="form-control" id="email" name="email" value="<%= user.local.email %>" />
        </div>                                       
    </div>

    <div class="form-group row">
        <div class="col-8">
            <button type="submit" class="btn btn-primary btn-lg pull-right">Save</button>
        </div>                                       
    </div>
</form>

Ma route :

app.post('/profile/edit', isLoggedIn, userController.profileEdit);

Mon controlleur (la source du problème selon moi) :

module.exports.profileEdit = function(req, res){

    User.findById(req.session.passport.user, function(err, doc){
        if(err){
            throw err;
        }

        var form = new formidable.IncomingForm();

        form.parse(req, function(err, fields, files){

            if(fields.email !== '' && fields.email !== doc.local.email){
                var email = ent.encode(fields.email);

                var isValid = function(){
                    return new Promise(function(resolve, resject){

                        var rEmail = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
                        if(!rEmail.test(email)){
                            resolve(false);
                        }
                        else{
                            resolve(true);
                        }
                    });
                }

                var isTaken = function(){
                    return new Promise(function(resolve, reject){
                        User.findOne({'local.email': email}, function(err, user){
                            if(err){
                                reject(err);
                            }
                            if(user){
                                resolve(true);
                            }
                            else{
                                resolve(false);
                            }
                        });
                    });
                };

                var updateEmail = function(){
                    return new Promise(function(resolve, reject){
                        User.findByIdAndUpdate(req.session.passport.user, {'local.email': email}, function(err, raw){
                            if(err){
                                reject(err);
                            }
                            else{
                                resolve(true);
                            }
                        });
                    });
                };

                isValid().then(function(res){
                    if(!res){
                        throw new Error('Veuillez entrer une adresse email valide');
                    }

                    return isTaken();
                }).then(function(res){
                    if(res){
                        throw new Error('Votre email est déjà prise par un autre utilisateur');
                    }

                    return updateEmail();
                }).then(function(res){

                    req.flash('success', 'Votre adresse mail a bien été mis à jour !');
                }).catch(function(err){

                    req.flash('error', err);
                });
            }

            res.redirect('/profile');
        });
    });

}

Il est très fort probable que je me sois emmêlé les pinceaux, j'ai engrangé pas mal de nouvelles connaissances ces derniers jours.

Merci à vous d'avoir lu mon message, bonne soirée/journée !

2 réponses


pour pouvoir utiliser un message flash, il faut passer par une URL de redirection, qui va contenir ton message flash et l'afficher sur ton template ensuite via req.flash

Plutôt que de faire une res.redirect('/profil'), tu fais une res.redirect('/success_flash') tu peuples le reg flash avec un message que tu veux et tu fis une res.redirect('/profil') avec le reg flash en paramètre.

Salut,

Tu as bien configuré ton app afin d'y greffer le middleware Connect-flash comme ils l'ont indiqué sur leur doc ? De plus, quelle version d'ExpressJS utilises-tu ? Car le projet Connect-flash n'est plus maintenu depuis ~5 ans.
Après c'est pas super compliqué de se créer son propre middleware pour la gestion des messages flash. Tu peux soit passer par un middleware ExpressJS, soit carrément passer par une fonction globale par exemple, dans les deux cas c'est pas compliqué à gérer ;)