2016-09-26 4 views
0

После входа в систему Я хочу переназначить/makeitem, для чего требуется открыть сеанс. Это работает, но после отправки формы регистрации я получаю сообщение об ошибке, и я должен обновиться, чтобы ввести/makeitem. Это работало отлично, прежде чем я начал использовать connect-session-sequelize. Файл cookie хранится в db.Sessions сразу, так что часть работает.После того, как я установил сеанс для хранения в db, перед его регистрацией существует задержка. Узел/Экспресс/экспресс-сессия,

Почему это происходит? Нужно ли проверять сеанс где-то еще в моем промежуточном программном обеспечении? Как я могу перенаправить его без каких-либо проблем? Я пропустил что-то очевидное?

Спасибо, и, пожалуйста, не просто ссылку на документы, я весь день смотрю на документы, и они заставляют моего довольно нового программиста причинять боль. Мне нужна любовь и образование.

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(); 
}); 
.... 

МАРШРУТЫ/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'); 
}); 
.... 

MIDDLEWARE/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"
  • "Connect-Session-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); 
    } 

});