successRedirect在护照登录本地护照中不起作用

问题描述

我正在使用带有续集和数据库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的护照的人很有用