node.js - 错误:无法将用户序列化到会话中 (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;
提前致谢!
解决方案
推荐阅读
- tensorflow - GPU中的Tensorflow默认数据格式
- typography - Gatsby.js - Typography.js
- android - 通知消息样式存储消息的位置
- c# - 在 C# 中生成 HTML 的最简洁方法是什么?
- azure - 在应用服务中访问 Azure MSI IMDS 端点时出现错误“无法连接到远程服务器”
- nodemcu - NodeMCU 从 webswerver 获取数据并更新值
- java - org.apache.spark.sql.AnalysisException: Can't extract value from UDF_DTTM_3#54: need struct type but got timestamp;
- c++ - 被这个语法迷惑了
- java - 如何使用 java 和 JSch 停止 Linux 上的 tomcat 服务器?
- android - 在 react-native 中管理堆栈的最佳导航方法是什么?