【问题标题】:express-flash message not working with passport custom callbackexpress-flash 消息不适用于护照自定义回调
【发布时间】:2016-04-25 19:48:45
【问题描述】:

我使用的是 express 4、passport 和 express-flash。当我使用罐装护照中间件功能并设置 failureFlash: true 时,一切正常。但是,当我在同一个路由文件中的注册函数中使用自定义回调时,它不起作用。 messages.info 对象为空。

这很好用:

    router.post('/login', passport.authenticate('local-login', {
        successRedirect: '/dashboard',
        failureRedirect: '/login',
        failureFlash: true
    }),
    function(req, res){
    }
);

这导致我的 messages.info 对象为空:

    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);
});

我使用玉作为我的预处理器:

    if (messages.info)
    .message.info
        span= messages.info

没用!

【问题讨论】:

  • 你用过app.use(flash()); 吗?
  • 尝试插入flash作为认证选项,即passport.authenticate('local-signup', { failureFlash: true }, function(err, user, info){...})
  • 我确实使用过 app.use(flash());在我的 app.js 文件中。当我将 {failureFlash: true} 放在我的本地注册函数中时,它会抛出 500。我不确定为什么内联中间件调用与自定义回调选项不同... F@$ck!

标签: node.js express


【解决方案1】:

好问题。

我发现了一些可以像这样发送 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

【讨论】:

    【解决方案2】:

    这行得通(当我输入错误的用户时,它会打印出“没有这样的用户”。它还会打印出带有错误组合的“无效密码”。):

    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")} );
    })
    

    .ejs

    <body>
        Log In
        <p><%=  messages %></p>
        <form action="/login" method = "post">
           username : <input type="text" name = "username"> <br>
           password : <input type="text" name = "password">
           <input type="submit" value = "Submit">
        </form>
    </body>
    

    【讨论】:

      【解决方案3】:

      如果有人在使用自定义回调(例如通过 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”。

      【讨论】:

        猜你喜欢
        • 2023-03-22
        • 1970-01-01
        • 2020-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-20
        相关资源
        最近更新 更多