首页 > 解决方案 > 在 ejs 上显示来自 passport.js 的登录错误消息

问题描述

我的无知不允许我在 passport.js 上显示登录错误消息。我想将message 定义的内容传递给我的 ejs 登录页面passport.use,但我迷失在流程中,因为我不确定谁在处理 done 函数,但我知道它以某种方式连接到passport.authenticate.

似乎在failureRedirect后台调用 res.render ,如果能够将来自 passport.use 的消息传递给它,那就太好了

我尝试设置 Flash 消息没有成功,但如果可能的话,我想避免这种情况。这是部分代码,主要是样板

passport.use(
    new LocalStrategy((username, password, done) => {
        User.findOne({ username: username }, (err, user) => {
            if (err) {
                return done(err);
            };
            if (!user) {
                console.log("Incorrect username");
                return done(null, false, { message: "Incorrect username" });
            }
            bcrypt.compare(password, user.password, (err, res) => {
                if (res) {
                    // passwords match! log user in
                    console.log("Si pudiste logearte!!");
                    return done(null, user)
                } else {
                    // passwords do not match!
                    console.log("Incorrect password");
                    return done(null, false, { message: "Incorrect password" })
                }
            })
        });
    })
);
router.post(
    "/log-in",
    passport.authenticate("local", {
        failureFlash: false,
        successRedirect: "/",
        failureRedirect: "/log-in"

    })
);

标签: node.jsexpresspassport.js

解决方案


你必须使用connect-flash来显示消息。

npm install connect-flash

改为failureFlash真。并且该错误将在视图中显示为messages.error

...

var cookieParser = require('cookie-parser');
var flash = require('connect-flash');
var app = express();

...

app.use(session({cookie: { maxAge: 60000 }}));
app.use(flash());

...
router.post(
    "/log-in",
    passport.authenticate("local", {
        failureFlash: true,
        successRedirect: "/",
        failureRedirect: "/log-in"

    })
);

推荐阅读