2016-09-26 57 views
0

登录后我想重新确定/ makeitem,这需要打开一个会话。这有效,但在提交登录表单后,我收到错误消息,并且必须刷新以输入/ makeitem。在我开始使用connect-session-sequelize之前,这工作得很好。 cookie会立即存储在db.Sessions中,以便部分工作。将会话设置为存储在数据库中之后,在注册之前会有一段延迟。节点/快速/快速会话,

这是怎么发生的?我是否需要在中间件的其他地方检查会话? 我怎样才能让它重定向没有任何hazzle? 我错过了一些明显的东西吗?

谢谢,请不要只是链接到文档,我一直在看文档,他们让我相当新的程序员脑部受伤。我需要爱情和教育。

SERVER.JS

'use strict'; 

var express = require('express'); 
var session = require('express-session'); 
var bodyParser = require('body-parser'); 
var cookieParser = require('cookie-parser'); 
var _ = require('underscore'); 
var app = express(); 

var db = require('./db.js'); 

// initalize sequelize with session store 
var SequelizeStore = require('connect-session-sequelize')(session.Store); 


// if heroku use that, else use 3000 
var PORT = process.env.PORT || 3000; 

app.use(cookieParser()); 

// Track logins with express session 
app.use(session({ 
    secret: 'Magic mike', 
    resave: true, 
    saveUninitialized: false, 
    store: new SequelizeStore({ 
     db: db.sequelize 
    }) 
})); 

// Make userId available in templates 
app.use(function(req, res, next){ 
    res.locals.currentUser = req.session.userId; 
    next(); 
}); 
.... 

ROUTES/INDEX.JS

var express = require('express'); 
var router = express.Router(); 
var _ = require('underscore'); 
var mid = require('../middleware/'); 
var db = require('../db.js'); 

..... 

// POST /login 
router.post('/login', function(req, res, next) { 
    var body = _.pick(req.body, 'email', 'password'); 

    if (req.body.email && req.body.password) { 
     db.user.authenticate(body).then(function(user) { 
      req.session.userId = user.id; 
      return res.redirect('makeitem'); 
     }); 
    } else { 
     var err = new Error('All fields required.'); 
     err.status = 400; 
     err.message = 'All fields required.'; 
     console.log(err.message); 
     res.send(err.message); 
    } 

}); 
..... 
    // GET /makeitem 
router.get('/makeitem', mid.requiresLogin, function(req, res, next) { 
    var body = _.pick(req.body, 'description', 'amount', 'purchased'); 

    return res.render('makeitem.pug'); 
}); 
.... 

中间件/ INDEX.JS

function loggedOut(req, res, next) { 
    if (req.session && req.session.userId) { 
     return res.redirect('/makeitem'); 
    } else { 
     return next(); 
    } 
} 

function requiresLogin(req, res, next) { 
    if (req.session && req.session.userId) { 
     return next(); 
    } else { 
     var err = new Error('You must be logged in to view this page'); 
     err.status = 401; 
     return next(err); 
    } 
} 

module.exports.loggedOut = loggedOut; 
module.exports.requiresLogin = requiresLogin; 

我相关的依赖关系是:

  • “明示”: “^ 4.14.0”
  • “表达会话”: “^ 1.14.1”
  • “sequelize”: “^ 3.5.1”
  • “连接会话-sequelize”: “^ 3.1.0”
  • “sequelize”: “^ 3.5.1”
  • “sqlite3的”: “^ 3.1.4”

回答

2

这听起来非常相似的问题:

Race Condition When Used With Passport

解决此问题的最佳方法是:

router.post('/login', function(req, res, next) { 
    var body = _.pick(req.body, 'email', 'password'); 

    if (req.body.email && req.body.password) { 
     db.user.authenticate(body).then(function(user) { 
      req.session.userId = user.id; 

      // Add this : 
      req.session.save(function() {    
       return res.redirect('makeitem'); 
      }); 

     }); 
    } else { 
     var err = new Error('All fields required.'); 
     err.status = 400; 
     err.message = 'All fields required.'; 
     console.log(err.message); 
     res.send(err.message); 
    } 

});