简体   繁体   English

req.session 未定义并继续重置

[英]req.session is undefind and keep resetting

i was trying to track if the user is logged in or not and if not and try to make a new post he will redirected to login page then i store the url he was trying to go to (the new post url) so when he log in he will be redirected there, i used express session to store that and have passport local to do the auth thing anyway the (new post) url is in the session but when i log in (doing post request) it just got deleted altho i tried other post requests to see if that the prob but it only reset on this post我试图跟踪用户是否登录,如果没有并尝试发布新帖子,他将重定向到登录页面然后我将他试图 go 的 url 存储到(新的帖子网址)所以当他登录时在他将在此重定向时,我使用了Express Z21D6F40CFB511982E4424E0E250A957Z来存储它,并在本地使用Passport来做AUTH的事物,无论如何(New Post)Z572D42D421E5E5E5E5E5E6B9BCC11D815E8A0212121212124444444444444444444444444444444444444444444444444444444444.尝试了其他帖子请求以查看是否有问题,但它仅在此帖子上重置

the middleware to check and store the url in the session用于检查 url 并将其存储在 session 中的中间件

    module.exports.isLoggedIn = (req, res, next) => {
    if (!req.isAuthenticated()) {
        req.session.returnTo = req.originalUrl
        console.log(req.session.returnTo)
        req.flash('error', 'You must be signed in first!');
        return res.redirect('/login');
    }
    next();
}

module.exports.isNotLoggedIn = (req, res, next) => {
    if (req.isAuthenticated()) {
        return res.redirect('/campgrounds')
    }
    next();
}

the login routes登录路径

const express = require('express');
const router = express.Router();
const passport = require('passport');
const catchAsync = require('../utils/catchAsync');
const User = require('../models/user');
const { isNotLoggedIn } = require('../middleware')

router.get('/register', isNotLoggedIn, (req, res) => {
    res.render('users/register');
});

router.post('/register', isNotLoggedIn, catchAsync(async (req, res, next) => {
    try {
        const { email, username, password } = req.body;
        const user = new User({ email, username });
        const registeredUser = await User.register(user, password);
        req.login(registeredUser, err => {
            if (err) return next(err);
            req.flash('success', 'Welcome to Yelp Camp!');
            res.redirect('/campgrounds');
        })
    } catch (e) {
        req.flash('error', e.message);
        res.redirect('register');
    }
}));

router.get('/login', isNotLoggedIn, (req, res) => {
    console.log(req.session)
    res.render('users/login');
})



router.post('/login', isNotLoggedIn, passport.authenticate('local', { failureFlash: true, failureRedirect: '/login' }), (req, res) => {
    req.flash('success', 'welcome back!');
    const returnTo = req.session.returnTo || '/campgrounds';
    console.log('this thsisdifsdk')
    console.log(req.session) //todo this req.session is getting reset for some reason and i cannot return to what page i was goin for
    res.redirect(returnTo);
})

router.get('/logout', (req, res) => {
    req.logout((err) => {
        if (err) { return next(err); }
        req.flash('success', "Goodbye!");
        res.redirect('/campgrounds');
    });

})

module.exports = router;

the app.js app.js

const express = require('express')
const path = require('path')
const mongoose = require('mongoose')
const ejsMate = require('ejs-mate');
const session = require('express-session')
const flash = require('connect-flash')
const ExpressError = require('./utils/ExpressError')
const methodOverride = require('method-override')
const passport = require('passport');
const LocalStrategy = require('passport-local')
const User = require('./models/user')

const userRoutes = require('./routes/user')
const campgroundRoutes = require('./routes/campgrounds')
const reviewRoutes = require('./routes/reviews');

mongoose.connect('mongodb://localhost:27017/yelp-camp');

const db = mongoose.connection //?shortcut
db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', () => {
    console.log('Database Connected');
})

const app = express();

app.engine('ejs', ejsMate)
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'))

app.use(express.urlencoded({ extended: true }));
app.use(methodOverride('_method'));
app.use(express.static(path.join(__dirname, 'public')))

const sessionConfig = {
    secret: 'meowmeowthecatsounduwu',
    resave: false,
    saveUninitialized: true,
    cookie: {
        httpOnly: true,
        expires: Date.now() + 1000 * 60 * 60 * 24 * 7,
        maxAge: 1000 * 60 * 60 * 24 * 7
    }
}

app.use(session(sessionConfig))
app.use(flash());

app.use(passport.initialize());
app.use(passport.session());
passport.use(new LocalStrategy(User.authenticate()));

passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

app.use((req, res, next) => {
    console.log(req.session)
    res.locals.currentUser = req.user;
    res.locals.success = req.flash('success');
    res.locals.error = req.flash('error');
    next();
})


app.use('/', userRoutes);

app.listen(3000, () => {
    console.log('Serving on port 3000')
})

things i tried remove the cookie, add for cookie secure: true, change secure: false, change the secret, make resave true and false, make saveUninitialized true and false, change the session name, nothing worked, i suspect that the passport is the problem but idk how to solve it我尝试删除cookie,为cookie添加安全:true,更改安全:false,更改密码,重新保存真假,使saveUninitialized真假,更改session名称,没有任何效果,我怀疑护照是问题,但不知道如何解决

passport.authenticate('local', {failureFlash:true, failureRedirect:'/login', keepSessionInfo:true}) passport.authenticate('local', {failureFlash:true, failureRedirect:'/login', keepSessionInfo:true})

router.post('/#', passport.authenticate('local', { failureFlash: true, failureRedirect: '/login', keepSessionInfo: true }) router.post('/#', passport.authenticate('local', { failureFlash: true, failureRedirect: '/login', keepSessionInfo: true })

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM