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

Khr*_*yus 5 mysql session node.js express

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

  • 表达
  • body-parser,获取 POST 数据
  • mysql,连接到我的数据库
  • 科尔斯
  • 快速会话
  • 快速 mysql 会话
  • bcrypt,将 POST 数据与数据库哈希值进行比较

我正在通过 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;
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

成功登录后,我检查我的会话,如下所示:

router.get('/session', function(req, res){
    res.json(req.session);
});
Run Code Online (Sandbox Code Playgroud)

我得到以下信息:

{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}}
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,没有任何user物体。我没有收到任何错误,也不知道问题出在哪里。

Asi*_*eed 2

var cookieParser = require('cookie-parser');
Run Code Online (Sandbox Code Playgroud)

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

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

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