快速消息消息不能与护照自定义回调一起使用

时间:2016-01-20 05:11:30

标签: node.js express

我正在使用快递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

没有用!

3 个答案:

答案 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>

    <% }) %>

This might help.

  

<强> res.locals

     

包含作用域的响应局部变量的对象   请求,因此仅适用于在期间呈现的视图   请求/响应周期(如果有)。否则,这个属性是   与app.locals相同。

     

此属性对于公开请求级别信息非常有用,例如   请求路径名称,经过身份验证的用户,用户设置等。

- express docs on res.locals