我正在学习在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 文件中进行更改,但仍然不起作用。
您的
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)
//...