首页 > 解决方案 > 错误:无法将用户序列化到会话中 (Passport.js)

问题描述

我在使用 Passport.js 模块时遇到错误。我提到了一些类似的问题,但似乎没有一个解决方案对我有用。

我的网站是一个学生登录系统。注册部分运行良好,但登录时出现错误。

当我尝试向仪表板验证用户身份时,出现以下错误:

Error: Failed to serialize user into session

我已经尝试过这样做,但没有奏效:

passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(user, done) {
  done(null, user);
});

这是我的 app.js

require("dotenv").config();
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const session = require("express-session");
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");
const Student = require("./models/student");
const app = express();

app.use(express.static("public"));
app.set("views", "./views");
app.set("view engine", "ejs");
app.use(
  bodyParser.urlencoded({
    extended: true,
  })
);

app.use(session({
  secret: process.env.SECRET,
  resave: false,
  saveUninitialized: false
}));

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

try {
  mongoose.connect(
    process.env.URL,
    { useNewUrlParser: true, useUnifiedTopology: true },
    () => console.log("Mongoose connected")
  );
} catch (e) {
  console.log("Failed to connect to mongoose!");
}

mongoose.set("useCreateIndex",true);

app.get("/register", function (req, res) {
  res.render("register");
});

app.post("/register", function (req, res) {

  Student.register({email: req.body.username}, req.body.password, function(err,user){
    if(err){
      console.log(err);
      res.redirect("/register");
    } else {
      passport.authenticate("local")(req,res,function(){
        res.redirect("/dashboard");
      })
    }
  })
});



app.get("/login", function (req, res) {
  res.render("login");
});

app.post("/login", function (req, res) {
  const student = new Student({
    email: req.body.username,
    password: req.body.password
  })
  
  req.login(student, function(err){
    if(err){
      console.log(err);
    } else {
      passport.authenticate("local")(req,res,function(){
      res.redirect("/dashboard");
      });
    }
  });
});


app.get("/dashboard", function(req,res){
  if(req.isAuthenticated()){
    res.render("studentdashboard");
  }else {
    res.redirect("/login");
  }
})




app.listen(3000, function () {
  console.log("Server started on port 3000...");
});

这是学生模式,我在其中添加了护照序列化和反序列化功能:

require('dotenv').config();
const mongoose = require("mongoose");
const session = require("express-session");
const passport = require("passport");
const passportLocalMongoose = require("passport-local-mongoose");

const studentSchema = new mongoose.Schema({
  fname: String,
  lname: String,
  prn: String,
  email: String,
  password: String,
  department: String,
  year: String,
  batch: Number,
  cgpi: String,
  kt: [{sem: String, subject: String}],
  sgpi:[String],
  placement_Status: String,
  placement_hist: [{Company: String, Package: String, Role: String}],
  achieve: [{atitle: String, certi: String}],
  skills: [{name: String, type: String}]

});


studentSchema.plugin(passportLocalMongoose);

const Student = new mongoose.model("Student", studentSchema);

passport.use(Student.createStrategy());
passport.use(Student.createStrategy());
passport.serializeUser(Student.serializeUser());
passport.deserializeUser(Student.deserializeUser());
module.exports = Student;

提前致谢!

标签: node.jsmongoosepassport.jsexpress-sessionpassport-local-mongoose

解决方案


推荐阅读