Passport登录会话错误



我在node.js中编写了一段代码,用于使用mongoose登录和注册页面。用于身份验证的方法是护照。但我收到了错误400注册页面的错误请求,并且未能将用户序列化到登录页面的会话错误中。

这是我的代码。

const express=require('express');
const bodyparser=require('body-parser');
const mongoose=require('mongoose');
const https=require('https');
const session=require('express-session');
const passport=require('passport');
const passportLocalMongoose=require('passport-local-mongoose');

const app=express();
app.use(express.static('public'));
app.set('view engine','ejs');

app.use(bodyparser.json());
app.use(bodyparser.urlencoded({ extended: true }));
app.use(session({
secret: 'My little secret of football tactics.',
resave: false,
saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());
mongoose.connect("mongodb://localhost:27017/bankDB" , {useUnifiedTopology:true, useNewUrlParser: true 
});
mongoose.set('useCreateIndex', true);
const bankschema=new mongoose.Schema({
username:{type:String},
email:{type:String,unique:true},
password1:String,
balance:{type:Number,default:0},
versionKey: false
});
bankschema.plugin(passportLocalMongoose);
bankschema.path('email').validate(async function(email){
const count= await mongoose.models.User.countDocuments({email})
return !count
},'Email-id already exists')
var User=mongoose.model("User",bankschema);
passport.use(User.createStrategy());
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.get("/singup.html",  function(req, res){
res.render("singup");
});
app.get("/login.html",  function(req, res){
res.render("login");
});
app.get("/",  function(req, res){
res.render("front");
});
app.get("/next.html",  function(req, res){
if(req.isAuthenticated()){
res.render("next");
}
else{
res.redirect("/login.html");
}
});

app.post("/singup.html", function(req, res){
User.register({email:req.body.email,username:req.body.username}, req.body.password1, 
function(err,user){
if(err){
console.log(err);
res.render('singup');
}else{
passport.authenticate("local")(req, res, function(){
console.log("success");
res.render("next");
});
}
});

});

app.post('/login.html', function(req, res){
const user=new User({
email:req.body.email,
password1:req.body.password1
});
req.login(user, function(err){
if(err){
console.log(err);
}
else{
passport.authenticate("local")(req, res, function(){
console.log("success");
res.render("next");
});
}
});
});

在注册过程中,passport.authenticate函数没有被执行,我不知道为什么。每次我尝试注册时都会说请求不正确,但输入的数据会存储在mongodb中。

app.post("/singup.html")内的password.authenticate函数中,您已重定向到res.redirect("/next.html")而不是res.render("next")。这是因为在对用户进行身份验证后,app.get("/next.html")必须检查其是否经过了身份验证,因此,您需要直接指向"/next.html",而不是呈现它,因为它与路由内的检查验证的含义相矛盾。试试这个,如果有任何问题就回来

最新更新