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 !