问题描述
我正在使用带有续集和数据库postgresql的node.js表达。问题出在护照登录失败中重定向工作正常sucessRedirect不会重定向到我想要的页面。它仍在加载且不响应任何内容,也不会出现任何错误。
当我提交登录名时,它将检查错误,如果错误可以在failRedirect中正常运行,但是在成功中,它将无法正常工作,就像页面已加载,仅不会转到目标页面,如果我停止项目并重新启动项目,它将在目标页面中!!我不知道有什么问题可以帮助我。
mainController.js
const express = require("express");
const sessions = require("express-session");
require("../model/MasterUser.model");
const passport = require("passport");
var session = sessions;
const router = express.Router();
router.get("/dashboard",(req,res) => {
res.render('dashboard');
});
router.get("/login",res) => {
res.render("login",{ layout: "login.hbs" });
});
router.post(
"/login",passport.authenticate("local",{
successRedirect: "/main/dashboard",failureRedirect: "/main/login",failureFlash: true,})
);
module.exports = router;
passport.js
const LocalStrategy = require("passport-local").Strategy;
const bcrypt = require("bcryptjs");
const sequelize = require("sequelize");
const masterUser = require("../model/MasterUser.model");
module.exports = function (passport) {
passport.use(
new LocalStrategy(
{ usernameField: "user_name" },(user_name,password,done) => {
// Match user
masterUser.findOne({ where: { user_name: user_name } }).then((user) => {
if (!user) {
return done(null,false,{
message: "This username is not registered",});
}
// Match password
bcrypt.compare(password,user.password,(err,isMatch) => {
if (err) throw err;
if (isMatch) {
return done(null,user);
} else {
return done(null,{ message: "Password incorrect" });
}
});
});
}
)
);
passport.serializeUser((user,done) => {
done(null,user.id);
});
passport.deserializeUser((id,done) => {
masterUser.findByPk(id,user) => {
done(err,user);
});
});
};
index.js
const express = require("express");
const Handlebars = require("handlebars");
var flash = require("connect-flash");
const app = express();
const path = require("path");
const bodyparser = require("body-parser");
const expressHandlebars = require("express-handlebars");
const passport = require("passport");
const sessions = require("express-session");
var session = sessions;
const MainController = require("./controllers/MainController");
const db = require("./config/database");
//test db
db.authenticate()
.then(() => console.log("Database Connected..."))
.catch((err) => console.log("error" + err));
//for security purpose
const cors = require("cors");
app.use(
cors()
);
//Passport Config
require("./config/passport")(passport);
app.use(cookieParser());
//use body parser
app.use(bodyparser.json());
app.use(bodyparser.urlencoded({ extended: true }));
const {
allowInsecurePrototypeAccess,} = require("@handlebars/allow-prototype-access");
app.use(
bodyparser.urlencoded({
urlencoded: true,})
);
app.use(
sessions({
secret: "secret_key",resave: false,saveUninitialized: true,cookie: { maxAge: 60000 },})
);
// use flash for show messages
app.use(flash());
// Passport middleware
app.use(passport.initialize());
app.use(passport.session());
//flash messages
app.use((req,res,next) => {
res.locals.success_msg = req.flash("success_msg");
res.locals.error_msg = req.flash("error_msg");
res.locals.error = req.flash("error");
next();
});
//setting up view Engine
app.set("views",path.join(__dirname,"/views"));
//using the hbs
app.engine(
"hbs",expressHandlebars({
extname: "hbs",defaultLayout: "default",layoutsDir: __dirname + "/views/layouts",handlebars: allowInsecurePrototypeAccess(Handlebars),})
);
app.set("view engine","hbs");
//route for Main
app.use("/main",MainController);
//default
app.get("/",res) => {
res.render("login");
});
app.listen(3000,() => {
console.log("App listening on port 3000!");
});
解决方法
问题已经解决,我在deserializeUser中编写了错误的代码。
passport.js之前
passport.deserializeUser((id,done) => {
masterUser.findByPk(id,(err,user) => {
done(err,user);
});
});
};
passport.js之后
passport.deserializeUser(function (id,done) {
masterUser.findOne({ where: { id: id } }).then((user) => {
done(null,user);
});
});
问题是续集获取的用户数据不同,所以现在对我有用。这对于使用带有续集的express和带有postgresql的护照的人很有用