具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?相关的知识,希望对你有一定的参考价值。

尝试使用Node.js和Express为我的个人项目工作。我正在使用mysql数据库作为我的会话存储,并安装了以下模块:

  • 表达
  • body-parser,用于获取POST数据
  • mysql,连接到我的DB
  • 心中
  • 快递会话
  • 表达MySQL的会话
  • bcrypt,用于将POST数据与DB哈希进行比较

我正在通过javascript从页面发送包含登录信息的POST请求,我将其与数据库中的哈希进行比较。如果匹配,我为用户创建会话。我想阻止用户再次登录,如果它有一个会话,但看起来似乎没有存储会话cookie。我通过查看req.session来验证这一点,但我创建的user对象从未出现过。

正在创建数据库中的记录:如果我使用正确的数据登录,则会创建新记录。我不确定这是否应该发生但如果我再次使用同一用户登录它会创建一个新记录。

这是我得到的:

var express    = require('express');
var app        = express();
var bodyParser = require('body-parser');
var mysql      = require('mysql');
var cors       = require('cors');
var session    = require('express-session');
var MySQLStore = require('express-mysql-session')(session);
var bcrypt     = require('bcrypt');

var options = { ... };
var pool = mysql.createPool(options);
var sessionConnection = mysql.createConnection(options);

var sessionStore = new MySQLStore({
    expiration: 10800000,
    createDatabaseTable: true,
    schema: {
        tableName: 'USERS_SESSIONS',
        columnNames: {
            session_id: 'session_id',
            expires: 'expires',
            data: 'data'
        }
    }
}, sessionConnection);

// i'll change key & secret later
app.use(session({
    key: '69Atu22GZTSyDGW4sf4mMJdJ42436gAs',
    secret: '3dCE84rey8R8pHKrVRedgyEjhrqGT5Hz',
    store: sessionStore,
    resave: false,
    saveUninitialized: true
}));

app.use(cors());

...

var router = express.Router();

router.post('/login', function(req, res){
    if (req.session.user){
         console.log('already logged in');
    }else{
        // get connection from pool, retrieve user record
        // PLAIN is password from request, row.HASH is the record's hash
        bcrypt.compare(PLAIN, row.HASH, function(err, match){
            // do error handling
            // when match = true do this

            req.session.user = {
                id: row.ID,
                nickname: row.NICK,
                isAuthed: true
            };
            res.sendStatus(200); // else send 401
            return;
        });
    }
});

成功登录后,我会检查我的会话:

router.get('/session', function(req, res){
    res.json(req.session);
});

我得到以下内容:

{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}}

正如你所看到的,没有user对象。我没有收到任何错误,我无法弄清问题在哪里。

答案
var cookieParser = require('cookie-parser');

请先添加app.use(cookieParser());

app.use(session({
    key: '69Atu22GZTSyDGW4sf4mMJdJ42436gAs',
    secret: '3dCE84rey8R8pHKrVRedgyEjhrqGT5Hz',
    store: sessionStore,
    resave: false,
    saveUninitialized: true
}));

有关详细文档https://www.npmjs.com/package/cookie-parser

以上是关于具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?的主要内容,如果未能解决你的问题,请参考以下文章

与 socket.io 一起使用时 express-session 未设置会话 cookie

从另一个端点检索时,使用 express-session 保存到 req.session 的数据为空

使用 express-session 和 JWT

express-session 和 cookie-session 有啥区别?

页面未使用 express-session 和护照 nodejs 正确重定向

使用 passport.js、mysql 和 express-session 保持登录状态