req flash 不显示带有护照 js 的消息

req flash not showing messages with passport js

express-flash 包与 passportjs 一起使用,我想向用户发送消息。

App.js

const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const sessions = require('express-session');
const passport = require('passport');
const passportInit = require('./config/passport');
const sessionStoreSQL = require('express-mysql-session')(sessions);
const logger = require('morgan');
const flash = require('express-flash');
const favicon = require('serve-favicon');
const app = express();


app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')))
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(cookieParser('keyboard cat'));
app.use(express.static(path.join(__dirname, 'public')));

app.use(sessions({
    genid: (req) => {
        return uuid.v1();
    },
    secret:'-----',
    resave:false,
    saveUninitialized:false,
    store:sessionStore
}));

app.use(passport.initialize());
app.use(passport.session());
app.use(flash());

passportInit(passport,userModel);

require('./routes/index')(app,passport);
require('./server/API/get')(app);

我使用自定义中间件功能将我的错误映射到,因此我可以在我的模板中访问所有这些

app.get('*', function(req,res,next){
    res.locals.successes = req.flash('success');
    res.locals.errors = req.flash('error');
    res.locals.warnings = req.flash('warning');
    next();
});

Passport.js

    passport.use('local-login', new localStategy({passReqToCallback:true},function (req,username,password,done){

        const isValidPassword = (userpass,password) => {
            return bcrypt.compareSync(password,userpass);
        }

        Model.findOne({
            where:{
                'username':username,
            },
        }).then(function(user){
            if(!user) return done(null,false,req.flash('warning','User does not exist'));

            if(!isValidPassword(user.password,password)) return done(null,false,req.flash('error','Incorrect password'));

            return done(null, user);

        }).catch(err => console.log(err));
    }))

这是我向用户发送消息的地方。

然后我有一个 EJS 组件来处理我的所有警报

Alerts.ejs

<% if (errors.lenght > 0) { %>
<div class='header alert alert-danger alert-dismissible'>
    <strong><i class="fa fa-exclamation-circle"></i> ERROR:</strong> <%- errors.message %>
    <a href="#" class='close' data-dismiss="alert" aria-label="close"><i class='fa fa-times'></i></a>
</div>
<% } %>

<% if (successes.lenght > 0 ) { %>
<div class='header alert alert-success alert-dismissible'>
    <strong><i class="fa fa-check-circle"></i> Success!</strong> <%- successes.message %>
    <a href="#" class='close' data-dismiss="alert" aria-label="close"><i class='fa fa-times'></i></a>
</div>
<% } %>

<% if (warnings.lenght > 0) { %>
<div class='header alert alert-warning alert-dismissible'>
    <strong><i class="fa fa-check-circle"></i> Warning:</strong> <%- warnings.message %>
    <a href="#" class='close' data-dismiss="alert" aria-label="close"><i class='fa fa-times'></i></a>
</div>
<% } %>

然后将其包含在我的模板中,例如像这样登录和注册

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title><%= title %> </title>
    <% include components/header.ejs %>
</head>

<body>
    <% include components/navbar.ejs %>

    <div class="container-fluid">
        <% include components/alerts.ejs %>
        <div class="row justify-content-center">
            <div class="col-auto">
                <form method="POST" action="/login">
                    <div class="form-group">
                        <label for="login-username">Username</label>
                        <input name="username" type="text" class="form-control" id="loginUsername"
                            aria-describedby="emailHelp" placeholder="Enter Username">
                    </div>
                    <div class="form-group">
                        <label for="login-password">Password</label>
                        <input name="password" type="password" class="form-control" id="loginPassword"
                            placeholder="Password">
                    </div>
                    <button type="submit" class="btn btn-primary">Submit</button>
                </form>
            </div>
        </div>
    </div>

</body>
<% include components/scripts.ejs %>

</html>

Routes.js

/* eslint-disable no-unused-vars */


module.exports = function (app,passport) {

  app.get('/', async function (req, res) {
      res.render('index', {title:'Home'});
  });


  app.post('/',function (req,res) {

  })

  app.get('/cryptofolio/:username',isAuthenticated, function(req,res) {
      res.render('cryptofolio', {title:'Cryptofolio'});
  })

  app.post('/portfolio',function(req,res){
      
  })

  app.get('/login',function(req,res){
      res.render('login',{title:'Login'});
  });

  app.post('/login',passport.authenticate('local-login',{successRedirect: '/',failureRedirect:'/login',failureFlash:true}));

  app.get('/register',function (req,res){
      res.render('register',{title:'Register'});
  })

  app.post('/register',passport.authenticate('local-register',{successRedirect: '/',failureRedirect:'/register',failureFlash:true}));

  app.get('/logout',function (req,res) {
      req.logout();
      res.redirect('/');
  })


  function isAuthenticated(req,res,next){
    if (req.isAuthenticated()){
        return next();
    }
    res.redirect('/login');
  }
};

但是当我输入错误的信息时,没有像他们那样闪现错误 should.D

我认为模板中的检查返回 false,因为它需要检查 length 而不是 lenght