我使用express-flash来显示登录时发生的错误消息,但收到错误:req.flash不是函数

问题描述 投票:0回答:1

我正在学习在nodejs中实现passport.js并使用express-flash来显示错误消息。 但我收到错误“req.flash 不是函数”。

导入所需模块后app.js的代码:-


app.set("view engine", "ejs")

//  initialize passport
initializePassport(passport)

// importing routes
const loginRoute = require("./routes/Login")
const registerRoute = require("./routes/Register")


// middlewares
app.use(bodyParser.urlencoded({ extended: true })) // make sure to use bodyParser before the router
app.use("/login", loginRoute)
app.use("/register", registerRoute)
app.use(session({
    secret: process.env.SESSION_SECRET,
    resave: false,
    saveUninitialized: false
}))
app.use(flash())
app.use(passport.initialize())
app.use(passport.session())

login.ejs代码:-

<h1>LogIn</h1>
<% if (locals.messages) { %>
    <%= messages.error %>
<% } %>
<form action="/login" method="POST">
    <div>
        <label for="email">Email</label>
        <input type="email" id="email" name="email" required="true">
    </div>
    <div>
        <label for="password"> Password</label>
        <input type="password" id="password" name="password" required="true">
    </div>
    <button type="submit">Login</button>
</form>

<a href="/register">Register</a>

我尝试在 login.ejs 文件中进行以下更改:-


<% if(messages) {%>
   <%= messages.error%>
<%}%>

但在这种情况下,我收到“消息未定义”的错误

login.js代码:-


const express = require("express")
const passport = require("passport")
const router = express.Router()

router.get('/', (req, res) => {
    res.render("login")
})

router.post('/', passport.authenticate('local', {
    successRedirect: '/register',
    failureRedirect: '/login',
    failureFlash: true
}))

module.exports = router

配置护照的代码:-


const LocalStrategy = require("passport-local").Strategy
const bcrypt = require("bcrypt")
const Users = require("./user")

async function getUserByEmail(email) {
    console.log(email)
    for (let i = 0; i < Users.length; i++){
        if (Users[i].email === email)
            return Users[i]
    }
    return null
}

async function authenticateUser(email, password, done) {
    try {
        const user = await getUserByEmail(email)

        if (user == null)
            return done(null, false, { message: "No user with that email exists!" })
        if (await bcrypt.compare(password, user.password))
            return done(null, user)
        else
            return done(null, false, { message: "Incorrect password!" })
    }    
    catch (err) {
        return done(err)
    }
}

function initialize(passport) {
    //  use LocalStrategy
    passport.use(new LocalStrategy(
        { usernameField: "email", passwordField: "password" }, authenticateUser))
    
    // serialize & deserialize
    // serialize user to store inside of a session
    passport.serializeUser((user,done) => {})
    passport.deserializeUser((id,done) => {})
}

module.exports = initialize

我尝试在 ejs 文件中进行更改,但仍然不起作用。

node.js express authentication passport.js ejs
1个回答
0
投票

您的

app.js
并不表明您已导入
express-flash

您需要:

npm install express-flash

然后在你的

app.js
中导入它就像

const flash = require('express-flash')

然后在您的路线之前

使用
flash中间件:

app.use(bodyParser.urlencoded({ extended: true })) app.use(flash()); app.use("/login", loginRoute) //...
    
© www.soinside.com 2019 - 2024. All rights reserved.