快递和护照发送后不能设置标题

时间:2016-09-07 01:49:11

标签: node.js express passport.js express-session

当我尝试登录或注册时,我在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
                }));

1 个答案:

答案 0 :(得分:1)

你的init.js中的

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

两个路由res.render异步地将响应发送回客户端。因此,当第二条路线尝试发送响应时,已经发送了第一条路线的res.render响应。这就是为什么它会抛出错误,就像在发送标题后不能设置标题一样。

按照下面给出的link示例。