2016-09-26 1 views
0

로그인 후/makeitem으로 다시 작성하고 싶습니다. 세션을 열어야합니다. 이 작동하지만 로그 양식을 제출 한 후 내 오류 메시지가 나타나고/makeitem 입력하려면 새로 고쳐야합니다. 내가 연결 세션 후편을 사용하기 전에 이것은 완벽하게 정상적으로 작동했습니다. 쿠키는 db.Sessions에 즉시 저장되어 파트가 작동합니다.세션이 db에 저장되도록 설정 한 후에는 등록되기 전에 지연이 있습니다. 노드/익스프레스/익스프레스 세션,

왜 이런 일이 발생합니까? 내 미들웨어의 다른 곳에서 세션을 확인해야합니까? 어떻게 헷갈 리지 않고 리디렉션 할 수 있습니까? 나는 명백한 무엇인가 놓치고 있냐?

감사합니다. docs에 연결하지 말고, 하루 종일 워드 프로세서를 보았습니다. 그들은 상당히 새로운 프로그래머가 머리를 아프게합니다. 나는 som 사랑과 교육이 필요합니다.

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

}); 
관련 문제