2016-09-07 4 views
0

У меня возникает ошибка в Node.js, когда я пытаюсь войти в систему или зарегистрироваться. Я использую connect-mongodb-session, но когда я настраиваю магазин, это происходит.Экспресс-сессия и паспорт Невозможно установить заголовки после их отправки

serializing user: 
{ _id: 57cf316758531915c8a93dd7, 
    email: 'a', 
    password: '$2a$10$1.qkrnLWLiG6zFXHTII1pOsHs0sWdFrmfgaGO.6ZY4q/TwZ7E0RTG', 
    username: 'a', 
    followers: [], 
    following: [], 
    likes: [], 
    orders: [], 
    __v: 0 } 
POST /login 302 793.072 ms - 46 
_http_outgoing.js:344 
    throw new Error('Can\'t set headers after they are sent.'); 
^ 
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:344:11) 
at ServerResponse.header (C:\Users\Fabian Gutierrez\Documents\GitHub\maravillarte\node_modules\express\lib\response.js:718:10) 
at ServerResponse.send (C:\Users\Fabian Gutierrez\Documents\GitHub\maravillarte\node_modules\express\lib\response.js:163:12) 
at done (C:\Users\Fabian Gutierrez\Documents\GitHub\maravillarte\node_modules\express\lib\response.js:957:10) 
at Immediate._onImmediate (C:\Users\Fabian Gutierrez\Documents\GitHub\maravillarte\node_modules\express-handlebars\lib\utils.js:26:13) 
at processImmediate [as _immediateCallback] (timers.js:383:17) 

Error: Can't set headers after they are sent. 

Я пробовал много вещей, но я не понимаю, что происходит

это мой код, app.s:

var passport = require('passport'); 
    var expressSession = require('express-session'); 
    var MongoDBStore = require('connect-mongodb-session')(expressSession);//session for stores sessions 
    //MONTAR EL STORE DE SESSIONS 
    var mystore = new MongoDBStore(dbConfig.store,function(error) { 
    if (error){ 
     console.log(error)  
    } 
    }); 

    app.use(expressSession({ 
    cookie:{ maxAge: 1000 * 60 * 60 * 24 * 7 }, 
    httpOnly: true, 
    store: mystore, 
    secret: 'mifuckingkey', 
    resave: true, 
    saveUninitialized: false, 
    unset: 'destroy' 
    })); 
    app.use(passport.initialize()); 
    app.use(passport.session()); 
    // Using the flash middleware provided by connect-flash to store messages in session 
    // and displaying in templates 
    var flash = require('connect-flash'); 
    app.use(flash()); 

    // Inicializar Passport 
    var initPassport = require('./lib/passport/init'); 
    initPassport(passport); 

    var routes = require('./routes/index')(passport); 
    app.use('/', routes); 

init.js

 var login = require('./login'); 
      var signup = require('./signup'); 
      var User = require('../../models/user'); 

      module.exports = function(passport){ 

       // Passport needs to be able to serialize and deserialize  users to support persistent login sessions 
       passport.serializeUser(function(user, done) { 
        console.log('serializing user: ');console.log(user); 
        done(null, user._id); 
       }); 

       passport.deserializeUser(function(id, done) { 
        User.findById(id, function(err, user) { 
         console.log('deserializing user:',user); 
         done(err, user); 
        }); 
       }); 
       console.log("passport iniciado") 
       // Setting up Passport Strategies for Login and SignUp/Registration 
       login(passport); 
       signup(passport); 
      } 

signup.js

var LocalStrategy = require('passport-local').Strategy; 
var User = require('../models/user'); 
var bCrypt = require('bcrypt-nodejs'); 

module.exports = function(passport){ 

passport.use('login', new LocalStrategy({ 
     passReqToCallback : true 
    }, 
    function(req, username, password, done) { 
     // check in mongo if a user with username exists or not 
     User.findOne({ 'username' : username }, 
      function(err, user) { 
       // In case of any error, return using the done method 
       if (err) 
        return done(err); 
       // Username does not exist, log the error and redirect back 
       if (!user){ 
        console.log('User Not Found with username '+username); 
        return done(null, false, req.flash('message', 'User Not found.'));     
       } 
       // User exists but wrong password, log the error 
       if (!isValidPassword(user, password)){ 
        console.log('Invalid Password'); 
        return done(null, false, req.flash('message', 'Invalid Password')); // redirect back to login page 
       } 
       // User and password both match, return user from done method 
       // which will be treated like success 
       return done(null, user); 
      } 
     ); 

    }) 
); 


var isValidPassword = function(user, password){ 
    return bCrypt.compareSync(password, user.password); 
} 

} 

signup.js

var LocalStrategy = require('passport-local').Strategy; 
     var User = require('../../models/user'); 
     var bCrypt = require('bcrypt-nodejs'); 

     module.exports = function(passport){ 

      passport.use('login', new LocalStrategy({ 
        passReqToCallback : true 
       }, 
       function(req, username, password, done) { 
        // check in mongo if a user with username exists or not 
        User.findOne({ 'username' : username }, 
         function(err, user) { 
          // In case of any error, return using the done method 
          if (err) 
           return done(err); 
          // Username does not exist, log the error and redirect back 
          if (!user){ 
           console.log('User Not Found with username '+username); 
           return done(null, false, req.flash('message', 'User Not found.'));     
          } 
          // User exists but wrong password, log the error 
          if (!isValidPassword(user, password)){ 
           console.log('Invalid Password'); 
           return done(null, false, req.flash('message', 'Invalid Password')); // redirect back to login page 
          } 
          // User and password both match, return user from done method 
          // which will be treated like success 
          return done(null, user); 
         } 
        ); 

       }) 
      ); 


      var isValidPassword = function(user, password){ 
       return bCrypt.compareSync(password, user.password); 
      } 

     } 

и часть маршрутизатора

router.get('/', function(req, res, next) { 
        res.render('home', { title: 'Maravillarte',user:req.user}); 
       }); 

       router.get('/vender', function(req, res, next) { 
        res.render('register', { title: 'Express',layout:'register' }); 
       }); 
       /*/////////////////////////////////////// 
       INICIO DE SESSION 
       ///////////////////////////////////////*/ 
       router.post('/login', passport.authenticate('login', { 
        successRedirect: '/', 
        failureRedirect: '/', 
        failureFlash: true, 
       })); 
        router.get('/login', function(req, res, next) { 
        res.render('pages/login', { title: 'Maravillarte',user:req.user}); 
       }); 
       /*/////////////////////////////////////// 
       REGISTRARSE 
       ///////////////////////////////////////*/ 
       router.post('/signup', passport.authenticate('signup', { 
        successRedirect: '/', 
        failureRedirect: '/', 
        failureFlash: true 
       })); 
+0

Можете ли вы показать свою функцию входа в систему и регистрации, где вы отправляете ответ? – abdulbarik

+0

Я добавил login.js и router.js, спасибо –

ответ

0

в вашем init.js,

// Setting up Passport Strategies for Login and SignUp/Registration 
       login(passport); 
       signup(passport); 

Оба маршрута res.render отправить ответ обратно клиенту асинхронно , Таким образом, когда второй маршрут пытается отправить ответ с ответом res.render первого маршрута, уже отправленного. Вот почему он выдает ошибку, как нельзя настроить заголовок после отправки.

следуйте приведенным ниже примерам link.

+0

Можете ли вы дать мне и пример того, как его решить ?, я очень смущен этим. спасибо –

+0

https://scotch.io/tutorials/easy-node-authentication-setup-and-local –

+0

Я сделал это, но. Я в том же состоянии, что и раньше :( –