2016-09-26 55 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); 
    } 

});