如何从 Passport.js 刷新消息?

Ham*_*dwn 5 node.js express passport-local passport.js

我已经创建了登录并注册了 Express 和 Passport js。我想添加错误密码或电子邮件的消息。

在我的 index.js (main) 中添加了护照和正文解析器中间件,并引用了路由:

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// route files
let index = require("./routes/index");
let auth = require("./routes/auth");
app.use("/", index);
app.use("/auth", auth);
Run Code Online (Sandbox Code Playgroud)

我创建了护照配置:

const LocalStrategy = require("passport-local").Strategy;
const User = require("../models/User");
const config = require("../config/database");
const bcrypt = require("bcryptjs");

module.exports = function(passport) {
  // Local Strategy
  passport.use(
    new LocalStrategy(
      {
        usernameField: "email",
        passwordField: "password"
      },
      (username, password, done) => {
        // Match Email
        let query = { email: username };
        User.findOne(query, function(err, user) {
          if (err) throw err;
          if (!user) {
            return done(null, false, { message: "No user found" });
          }

          // Match Password
          bcrypt.compare(password, user.password, function(err, isMatch) {
            if (err) throw err;
            if (isMatch) {
              return done(null, user);
            } else {
              return done(null, false, { message: "Wrong password" });
            }
          });
        });
      }
    )
  );

  passport.serializeUser(function(user, done) {
    done(null, user.id);
  });

  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });
};
Run Code Online (Sandbox Code Playgroud)

还为它添加了一条路线:

// Login Process
router.post("/login", (req, res, next) => {
  passport.authenticate("local", {
    successRedirect: "/",
    failureRedirect: "/auth/login",

    failureFlash: true
  })(req, res, next);
});
Run Code Online (Sandbox Code Playgroud)

successRedirect 和 failureRedirect 工作正常,但它没有给我任何错误。我在视频中的 youtube 视频上做了它,但在我的代码中却没有。

连接闪存的配置:

const flash = require("connect-flash");
app.use(require("connect-flash")());
Run Code Online (Sandbox Code Playgroud)

Sau*_*ari 3

你的代码没有问题,只是你使用的express版本不同。从 Passportjs Flash 消息文档中,

注意:使用 flash 消息需要req.flash()函数。Express 2.x 提供了此功能,但已从 Express 3.x 中删除。使用 Express 3.x 时,建议使用 connect-flash 中间件来提供此功能。

因此,您需要按照推荐安装connect-flash Express 中间件。

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

app.configure(function() {
  app.use(express.cookieParser('keyboard cat'));
  app.use(express.session({ cookie: { maxAge: 60000 }}));
  app.use(flash());
});
Run Code Online (Sandbox Code Playgroud)

使用 flash 中间件后,所有请求都将具有可用于 flash 消息的 req.flash() 函数。

app.get('/flash', function(req, res){
  req.flash('info', 'Flash is back!')
  res.redirect('/');
});

app.get('/', function(req, res){
  res.render('index', { messages: req.flash('info') });
});
Run Code Online (Sandbox Code Playgroud)

这可能对你有帮助。