2016-11-16 62 views
2

我是NodeJS和ExpressJS的新手,并试图建立与MySQL数据存储的会话功能。至于如何调用它,我遵循了文档,但在运行这些命令后,req.session未定义。我已经证实,当我实例化cookie和会话时,我有一个到MySQL数据库的活动连接和一个常见的cookie秘密。我没有得到任何错误,但这里是控制台调试输出...ExpressJS会话与MySQL数据存储不起作用

终端$清晰; DEBUG =表达对MySQL的会话* NPM启动

[email protected]启动node_app

节点./bin/www

GET /登录200 7.458毫秒 - 249

快递MySQL的会话:记录生成会话存储+ 0毫秒

快递MySQL的会话:登录设置默认选项+ 3ms的

POST /登录200 40.744毫秒 - 47个

快递MySQL的会话:登录设置有效期:900000ms + 7毫秒

express- MySQL的会话:登录结算到期间隔+ 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)的代码,输出不确定的。我是否错过了调用cookie和db store会话的步骤?

回答

0

我发现,没有被调用的会话,我需要通过破坏会话调用这样

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

,而不是这个

app.use(session(session_options)); 
手动调用它