与MySQL数据存储的ExpressJS会话无法正常工作

时间:2016-11-16 19:25:28

标签: node.js express

我是NodeJS和ExpressJS的新手,我正在尝试使用MySQL数据存储设置会话功能。我已经按照文档的方式调用了它,但是在运行命令之后,req.session是未定义的。我已经验证我在实例化cookie和会话时有一个与MySQL数据库的活动连接和一个常见的cookie秘密。我没有收到任何错误,但这是控制台调试输出...

  

terminal $ clear; DEBUG = express-mysql-session * npm start

     

node-app@0.0.0 start node_app

     

节点./bin/www

     

GET /登录200 7.458 ms - 249

     

express-mysql-session:log创建会话存储+ 0ms

     

express-mysql-session:log设置默认选项+ 3ms

     

POST / login 200 40.744 ms - 47

     

express-mysql-session:log设置有效期:900000ms + 7ms

     

express-mysql-session:log清除到期间隔+ 0ms`

我在运行时尝试启用调试...

var pool = mysql.createPool(options);

我甚至没有看到查询尝试运行以将会话添加到会话表。

这是我的申请流程: 在我的main.js文件中,我在顶部捕获所有请求并检查有效会话,如果我找不到,我会显示登录表单。

app.get('/*',function(req, res){ 
if (!req.session) {
    var login = require('../js/login_functions');
    res.send( login.getLoginForm() );
}});

登录表单发布到/ login,我验证用户名/密码是否有效,然后我创建了一个包含所需session.js文件的会话。这是session.js中的代码

var config = require('../admin/config');
var express = require('express');
var app = module.exports = express();
var db = require('../js/database');
var session = require('express-session');
var MySQLStore = require('express-mysql-session')(session);

module.exports = {
    createSession: function( req, callback ){
        db.getConnection( function( connection ){           
            var session_store_options = {
                checkExpirationInterval: 900000,// How frequently expired sessions will be cleared; milliseconds. 
                expiration: config.SESS_MAX_AGE,// 10 hours session expiration
                createDatabaseTable: false,
                connectionLimit: config.DB_CONNECTION_LIMIT, 
                schema: {
                    tableName: config.SESS_TABLE_NAME,
                    columnNames: {
                        session_id: 'session_id',
                        expires: 'expires',
                        data: 'user_data'
                    }
                }
            };

            var session_options = {
                key: config.SESS_COOKIE_NAME,
                secret: config.SESS_SECRET,
                store: new MySQLStore(session_store_options, connection),
                cookie: { maxAge: config.SESS_MAX_AGE },
                genid: function(req) {
                    return genuuid() // use UUID for session ID
                },
                rolling: true,
                resave: false,
                saveUninitialized: false,
            };

            if( config.ENV.toLowerCase() === 'prod' ){
                session_options.cookie.secure = true;
            }
            app.use( session( session_options ) );
            if( config.DEBUG ){
                console.log( req.session );
            }
            callback( session );
        });
    }
};

当我在上面的底部运行console.log(req.session)时,它会输出undefined。我错过了调用cookie和db存储会话的步骤吗?

1 个答案:

答案 0 :(得分:0)

我发现会话没有被调用,我需要通过分解这样的会话调用来手动调用它

sess = session_( session_options );
sess( req, res, function(err){ if(err) console.log( 'error:', err ); } );
app.use( sess );

而不是这个

app.use( session( session_options ) );