Khr*_*yus 5 mysql session node.js express
尝试使用 Node.js 和 Express 为我的个人项目启动会话。我使用 MySQL 数据库作为会话存储,并安装了以下模块:
我正在通过 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物体。我没有收到任何错误,也不知道问题出在哪里。
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