重定向后快速会话不持久

Dra*_*tix 6 javascript node.js express express-session

昨天,我尝试使用 Node.js 和 Express.js 框架制作一个网站。在这个网站上,用户需要使用凭据登录数据库。如果凭据正确,我想在会话中保存用户的信息。

在这个目标中,我使用了中间件 Express-Session,但我有一个问题。当用户键入好的凭据时,其信息会正确存储在会话中。但是,在将用户重定向到主页后,会话被清除,因此存储用户信息的变量现在未定义。

我尝试了很多解决方案,我搜索了很多,但我没有解决这个问题......

有我的代码: app.js :

const createError = require('http-errors');
const express = require('express');
const session = require('express-session');
const path = require('path');
const helmet = require('helmet');
const cookieParser = require('cookie-parser');
const logger = require('morgan');
const bodyParser = require('body-parser');

const indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
const admRouter = require('./routes/adm');

const urlencodedParser = bodyParser.urlencoded({extended : false});

const app = express();

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

app.use(logger('dev'));
app.use(express.json());
app.use(urlencodedParser);
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use(session({secret: 'secret', resave: false, saveUninitialized: false, cookie: { maxAge : 60000, secure: false }}));

app.use('/', indexRouter);
app.use('/users', usersRouter);
app.use('/adm', admRouter);

// On utilise helmet pour sécuriser l'application.
app.use(helmet());

// catch 404 and forward to error handler
app.use(function(req, res, next) {
    next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

module.exports = app;

app.listen(80);
Run Code Online (Sandbox Code Playgroud)

和 index.js :

const express = require('express');
const router = express.Router();
const bodyParser = require('body-parser');
const verif = require('../functions/verif');
const password = require('node-php-password');

const dbServer = require('../database');
// const credentials = require('../functions/dbCredentials');

// const dbServer = mysql.createConnection(credentials);

const urlencodedParser = bodyParser.urlencoded({extended : false});

/* GET home page. */
router.get('/', function(req, res, next) {
    console.log(JSON.stringify(req.session.user));
    res.render('index', {verif, req });
});

router.post('/login', urlencodedParser, (req, res, next) => {
    if(req.body.username !== undefined && req.body.password !== undefined) {
        if(req.body.username !== null && req.body.password !== null) {
            dbServer.query('SELECT * FROM users WHERE username = ?', [req.body.username], function(error, result, fields) {
                if (error) throw error;
                // if(password.verify(req.body.password, result))
                console.log("resultat : " + JSON.stringify(result));
                if(result.length > 0) {
                    const utilisateur = result[0]; // On stocke la ligne concernant l'utilisateur dans une constante locale.
                    console.log("L'utilisateur existe.");
                    // On teste le résultat obtenu, pour savoir si son mot de passe est correct.
                    if(password.verify(req.body.password, utilisateur.password)) {
                        console.log("Mot de passe correct.");
                        req.session.user = utilisateur;
                        console.log(req.session.user);
                    } else {
                        // TODO : Session, pour afficher l'erreur.
                        console.log("Mot de passe incorrect.");
                    }
                }
                else {
                    console.log("L'utilisateur n'existe pas.")
                    // TODO : Session, pour afficher l'erreur.
                }
            });
        }
    }
    res.redirect('/');
});

module.exports = router;
Run Code Online (Sandbox Code Playgroud)

使用此代码,当用户登录时:

console.log(req.session.user);
Run Code Online (Sandbox Code Playgroud)

显示正确的信息,但该行:

console.log(JSON.stringify(req.session.user));
Run Code Online (Sandbox Code Playgroud)

对于路线“/”显示“未定义”。

所以,我在这种情况下有点迷茫......你有解决这个问题的想法吗?提前致谢 =)

小智 2

问题是,你太早地改变了他们的方向。数据库查询比服务器中运行的大多数代码花费的时间要长得多,这就是使用回调和承诺的原因。我会res.redirect('/')在数据库查询末尾向右移动。就在最后一个 else 语句之后。这应该可以解决这个问题,因为它允许在重定向之前运行所有内容。