我正在使用快递4,护照和快递。当我使用固定护照中间件功能并设置failureFlash:true时,一切正常。但是当我在相同路由文件中的寄存器功能中使用自定义回调时,它不起作用。 messages.info对象为null。
这很好用:
router.post('/login', passport.authenticate('local-login', {
successRedirect: '/dashboard',
failureRedirect: '/login',
failureFlash: true
}),
function(req, res){
}
);
这导致我的messages.info对象为null:
router.post('/register', function(req, res, next){
passport.authenticate('local-signup', function(err, user, info){
if(err){
req.flash('info', err);
res.render('register');
}else{
res.render('profile');
}
})(req, res, next);
});
我正在使用jade作为我的预处理器:
if (messages.info)
.message.info
span= messages.info
没有用!
答案 0 :(得分:2)
这样可行(当我输入错误的用户时,它打印出“没有这样的用户”。它还会输出错误组合的“无效密码”。):
el.getelementsbyclassname
.ejs
passport.use("login", new LocalStrategy(function(username, password, done){
User.findOne({username : username}, function(err, user){
if(err){return done(err)}
if(!user){
return done(null, false, {messages : "no such user" })
}
if(user.password != password){
return done(null, false, {messages : "invalid password"})
}else{
return done(null , user);
}
})
}))
app.post("/login", function(req, res, next){
passport.authenticate("login", function(err, user, info){
if(err){ return next(err);}
if(!user){return res.render("login", {messages : info.messages})}
req.logIn(user, function(err){
if(err){ return next(err); }
return res.redirect("/authed");
})
})(req, res, next)
})
app.get("/login", function(req, res){
console.log(req.session)
res.render("login" , {messages : req.flash("error")} );
})
答案 1 :(得分:2)
如果有人在使用自定义回调(例如通过 ajax 登录)时仍然无法访问消息:
app.post('/login', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
if(err) { return res.redirect('/info'); }
if(!user) { return res.json(info); }
req.logIn(user, function(err) {
if(err) { return next(err); }
return res.json(req.body.user);
})
})(req,res,next);
})
passport.authenticate 中的 info 变量将保存您在策略中设置为“消息”的值:
const authenticateUser = async (email, password, done) => {
const user = await findUserByEmail(email);
console.log(user);
if( user == null ) {
return done(null, false, { message: 'Nenhum usuário com este email.'});
}
try {
if (await bcrypt.compare(password, user.password)){
return done(null, user);
} else {
return done(null, false, { message: 'Senha incorreta.' })
}
} catch (e) {
done(e);
}
}
就我而言, 'Nenhum usuário com este 电子邮件。和“Senha incorreta”。
答案 2 :(得分:0)
好问题。
我发现了一些可以发送flash消息的工作代码:
router.use(function(req, res, next){
res.locals.errors = req.flash("error");
next();
})
在EJS中
<% errors.forEach(function(error) { %>
<div class="alert alert-danger" role = "alert">
<%= error %>
</div>
<% }) %>
<强> res.locals 强>
包含作用域的响应局部变量的对象 请求,因此仅适用于在期间呈现的视图 请求/响应周期(如果有)。否则,这个属性是 与app.locals相同。
此属性对于公开请求级别信息非常有用,例如 请求路径名称,经过身份验证的用户,用户设置等。