Javascript Passport.js:无法将用户序列化到会话中(已添加序列化代码)?
我是nodejs的新手,正在尝试构建登录系统。我在config/passport.js中添加了从passport文档序列化用户的代码。但我仍然遇到了错误:当我输入有效的电子邮件和密码登录时,未能将用户序列化到会话中。有人能指出我做错了什么吗 app.jsJavascript Passport.js:无法将用户序列化到会话中(已添加序列化代码)?,javascript,node.js,express,mongoose,passport.js,Javascript,Node.js,Express,Mongoose,Passport.js,我是nodejs的新手,正在尝试构建登录系统。我在config/passport.js中添加了从passport文档序列化用户的代码。但我仍然遇到了错误:当我输入有效的电子邮件和密码登录时,未能将用户序列化到会话中。有人能指出我做错了什么吗 app.js const express = require('express'); const expressLayouts = require('express-ejs-layouts'); const mongoose = require('mong
const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const mongoose = require('mongoose');
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');
const app = express();
//Passport config
require('./config/passport')(passport);
//DB config
require('dotenv').config(); //for setting environment variables on server
const uri = process.env.ATLAS_URI;
mongoose.connect(uri,{useNewUrlParser:true ,useUnifiedTopology: true})
.then(() => console.log("mongodb connected"))
.catch(err => console.log(err));
//EJS
app.use(expressLayouts);
app.set('view engine','ejs');
//Express Bodyparser
app.use(express.urlencoded({extended:true}));
//Express session
app.use(session({
secret: 'secret',
resave: true,
saveUninitialized: true,
}));
//Passport middleware for authentication and login
app.use(passport.initialize());
app.use(passport.session());
//connect flash
app.use(flash());
//global variables to create 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();
});
//Routes
app.use('/',require('./routes/index'));
app.use('/users',require('./routes/users'));
const PORT = process.env.PORT || 5000;
app.listen(PORT,console.log(`Server started on port ${PORT}`));
const localStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
//load user model
const User = require('../models/User');
module.exports = function(passport) {
passport.use(
new localStrategy({usernameField:'email'},(email,password,done) => {
//Check if email is registered
User.findOne({email:email})
.then( user => {
if(!user){
return done(null,false,{message:'This email is not registered'});
}
//if email exists we compare password
bcrypt.compare(password,user.password,(err,isMatch) => {
if(err) throw err;
if(isMatch){
return done(null,true);
}
else{
return done(null,false,{message:'Wrong Password!'});
}
});
}
)
.catch(err => console.log(err));
})
);
//Serialize and deserialize user
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
};
const express = require('express');
const router = express.Router();
const User = require('../models/User');
const bcrypt = require('bcryptjs');
const passport = require('passport');
//Login page
router.get('/login',(req,res)=>res.render('login'));
//Register
router.get('/register',(req,res)=>res.render('register'));
//Registration Handling
router.post('/register',(req,res) =>{
const { name, email, password, password2 } = req.body;
let errors = [];
//Check required fields
if(!name || !email ||!password || !password2){
errors.push({msg:'Please fill required fields'});
}
//check if passwords equal
if(password !== password2){
errors.push({msg:'Passwords do not match'});
}
//check password length
if(password.length<6){
errors.push({msg:'Password should be atleast 6 characters'});
}
if(errors.length>0){
res.render('register',{
errors,
name,
email,
password,
password2
});
}else{
//Validation passed
//check if email already exists
User.findOne({email:email})
.then(user => {
if(user){
errors.push({msg:'Email already registered'});
res.render('register',{
errors,
name,
email,
password,
password2,
});
}
else{
const newUser = new User({
name,
email,
password,
});
//Hash password
bcrypt.genSalt(10,(err,salt) => {
if(err) throw err;
bcrypt.hash(newUser.password,salt,(err,hash) => {
if(err) throw err;
//set password to hash
newUser.password = hash
//save user
newUser.save()
.then( user => {
req.flash('success_msg','Thanks for registering!You can login now');
res.redirect('/users/login');
})
.catch(err => {
console.log(err);
});
});
});
}
});
}
});
//Login handling
router.post('/login',(req,res,next) => {
passport.authenticate('local',{
successRedirect:'/dashboard',
failureRedirect:'/users/login', //these routes are wrt host
failureFlash: true,
})(req,res,next);
});
module.exports = router
config/passport.js
const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const mongoose = require('mongoose');
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');
const app = express();
//Passport config
require('./config/passport')(passport);
//DB config
require('dotenv').config(); //for setting environment variables on server
const uri = process.env.ATLAS_URI;
mongoose.connect(uri,{useNewUrlParser:true ,useUnifiedTopology: true})
.then(() => console.log("mongodb connected"))
.catch(err => console.log(err));
//EJS
app.use(expressLayouts);
app.set('view engine','ejs');
//Express Bodyparser
app.use(express.urlencoded({extended:true}));
//Express session
app.use(session({
secret: 'secret',
resave: true,
saveUninitialized: true,
}));
//Passport middleware for authentication and login
app.use(passport.initialize());
app.use(passport.session());
//connect flash
app.use(flash());
//global variables to create 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();
});
//Routes
app.use('/',require('./routes/index'));
app.use('/users',require('./routes/users'));
const PORT = process.env.PORT || 5000;
app.listen(PORT,console.log(`Server started on port ${PORT}`));
const localStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
//load user model
const User = require('../models/User');
module.exports = function(passport) {
passport.use(
new localStrategy({usernameField:'email'},(email,password,done) => {
//Check if email is registered
User.findOne({email:email})
.then( user => {
if(!user){
return done(null,false,{message:'This email is not registered'});
}
//if email exists we compare password
bcrypt.compare(password,user.password,(err,isMatch) => {
if(err) throw err;
if(isMatch){
return done(null,true);
}
else{
return done(null,false,{message:'Wrong Password!'});
}
});
}
)
.catch(err => console.log(err));
})
);
//Serialize and deserialize user
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
};
const express = require('express');
const router = express.Router();
const User = require('../models/User');
const bcrypt = require('bcryptjs');
const passport = require('passport');
//Login page
router.get('/login',(req,res)=>res.render('login'));
//Register
router.get('/register',(req,res)=>res.render('register'));
//Registration Handling
router.post('/register',(req,res) =>{
const { name, email, password, password2 } = req.body;
let errors = [];
//Check required fields
if(!name || !email ||!password || !password2){
errors.push({msg:'Please fill required fields'});
}
//check if passwords equal
if(password !== password2){
errors.push({msg:'Passwords do not match'});
}
//check password length
if(password.length<6){
errors.push({msg:'Password should be atleast 6 characters'});
}
if(errors.length>0){
res.render('register',{
errors,
name,
email,
password,
password2
});
}else{
//Validation passed
//check if email already exists
User.findOne({email:email})
.then(user => {
if(user){
errors.push({msg:'Email already registered'});
res.render('register',{
errors,
name,
email,
password,
password2,
});
}
else{
const newUser = new User({
name,
email,
password,
});
//Hash password
bcrypt.genSalt(10,(err,salt) => {
if(err) throw err;
bcrypt.hash(newUser.password,salt,(err,hash) => {
if(err) throw err;
//set password to hash
newUser.password = hash
//save user
newUser.save()
.then( user => {
req.flash('success_msg','Thanks for registering!You can login now');
res.redirect('/users/login');
})
.catch(err => {
console.log(err);
});
});
});
}
});
}
});
//Login handling
router.post('/login',(req,res,next) => {
passport.authenticate('local',{
successRedirect:'/dashboard',
failureRedirect:'/users/login', //these routes are wrt host
failureFlash: true,
})(req,res,next);
});
module.exports = router
routes/users.js
const express = require('express');
const expressLayouts = require('express-ejs-layouts');
const mongoose = require('mongoose');
const flash = require('connect-flash');
const session = require('express-session');
const passport = require('passport');
const app = express();
//Passport config
require('./config/passport')(passport);
//DB config
require('dotenv').config(); //for setting environment variables on server
const uri = process.env.ATLAS_URI;
mongoose.connect(uri,{useNewUrlParser:true ,useUnifiedTopology: true})
.then(() => console.log("mongodb connected"))
.catch(err => console.log(err));
//EJS
app.use(expressLayouts);
app.set('view engine','ejs');
//Express Bodyparser
app.use(express.urlencoded({extended:true}));
//Express session
app.use(session({
secret: 'secret',
resave: true,
saveUninitialized: true,
}));
//Passport middleware for authentication and login
app.use(passport.initialize());
app.use(passport.session());
//connect flash
app.use(flash());
//global variables to create 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();
});
//Routes
app.use('/',require('./routes/index'));
app.use('/users',require('./routes/users'));
const PORT = process.env.PORT || 5000;
app.listen(PORT,console.log(`Server started on port ${PORT}`));
const localStrategy = require('passport-local').Strategy;
const mongoose = require('mongoose');
const bcrypt = require('bcryptjs');
//load user model
const User = require('../models/User');
module.exports = function(passport) {
passport.use(
new localStrategy({usernameField:'email'},(email,password,done) => {
//Check if email is registered
User.findOne({email:email})
.then( user => {
if(!user){
return done(null,false,{message:'This email is not registered'});
}
//if email exists we compare password
bcrypt.compare(password,user.password,(err,isMatch) => {
if(err) throw err;
if(isMatch){
return done(null,true);
}
else{
return done(null,false,{message:'Wrong Password!'});
}
});
}
)
.catch(err => console.log(err));
})
);
//Serialize and deserialize user
passport.serializeUser(function(user, done) {
done(null, user.id);
});
passport.deserializeUser(function(id, done) {
User.findById(id, function(err, user) {
done(err, user);
});
});
};
const express = require('express');
const router = express.Router();
const User = require('../models/User');
const bcrypt = require('bcryptjs');
const passport = require('passport');
//Login page
router.get('/login',(req,res)=>res.render('login'));
//Register
router.get('/register',(req,res)=>res.render('register'));
//Registration Handling
router.post('/register',(req,res) =>{
const { name, email, password, password2 } = req.body;
let errors = [];
//Check required fields
if(!name || !email ||!password || !password2){
errors.push({msg:'Please fill required fields'});
}
//check if passwords equal
if(password !== password2){
errors.push({msg:'Passwords do not match'});
}
//check password length
if(password.length<6){
errors.push({msg:'Password should be atleast 6 characters'});
}
if(errors.length>0){
res.render('register',{
errors,
name,
email,
password,
password2
});
}else{
//Validation passed
//check if email already exists
User.findOne({email:email})
.then(user => {
if(user){
errors.push({msg:'Email already registered'});
res.render('register',{
errors,
name,
email,
password,
password2,
});
}
else{
const newUser = new User({
name,
email,
password,
});
//Hash password
bcrypt.genSalt(10,(err,salt) => {
if(err) throw err;
bcrypt.hash(newUser.password,salt,(err,hash) => {
if(err) throw err;
//set password to hash
newUser.password = hash
//save user
newUser.save()
.then( user => {
req.flash('success_msg','Thanks for registering!You can login now');
res.redirect('/users/login');
})
.catch(err => {
console.log(err);
});
});
});
}
});
}
});
//Login handling
router.post('/login',(req,res,next) => {
passport.authenticate('local',{
successRedirect:'/dashboard',
failureRedirect:'/users/login', //these routes are wrt host
failureFlash: true,
})(req,res,next);
});
module.exports = router
const express=require('express');
const router=express.router();
const User=require('../models/User');
const bcrypt=require('bcryptjs');
const passport=require(‘passport’);
//登录页面
router.get('/login',(req,res)=>res.render('login');
//登记册
router.get('/register',(req,res)=>res.render('register');
//登记处理
路由器.post('/register',(req,res)=>{
const{name,email,password2}=req.body;
让错误=[];
//检查必填字段
如果(!name | | |!email | |!password | |!password2){
错误。推送({msg:'Please fill required fields'});
}
//检查密码是否相等
如果(密码!==密码2){
错误。推送({msg:'Passwords not match'});
}
//检查密码长度
如果(密码长度0){
res.render('寄存器'{
错误,
名称
电子邮件,
密码,
密码2
});
}否则{
//通过验证
//检查电子邮件是否已经存在
User.findOne({email:email})
。然后(用户=>{
如果(用户){
错误。推送({msg:'Email ready registered'});
res.render('寄存器'{
错误,
名称
电子邮件,
密码,
密码2,
});
}
否则{
const newUser=新用户({
名称
电子邮件,
密码,
});
//散列密码
bcrypt.genSalt(10,(错误,盐)=>{
如果(错误)抛出错误;
bcrypt.hash(newUser.password,salt,(err,hash)=>{
如果(错误)抛出错误;
//将密码设置为哈希
newUser.password=hash
//保存用户
newUser.save()
。然后(用户=>{
req.flash('success_msg','Thank for registing!You can't login now');
res.redirect('/users/login');
})
.catch(错误=>{
控制台日志(err);
});
});
});
}
});
}
});
//登录处理
router.post('/login',(req,res,next)=>{
passport.authenticate('local'{
successRedirect:“/dashboard”,
failureRedirect:“/users/login”,//这些路由是wrt主机
failureFlash:没错,
})(req、res、next);
});
module.exports=路由器
当密码与passport.js中的密码匹配时,我将错误的参数传递给了done()。
我曾经
它应该在哪里
if(isMatch){
return done(null,user);
}