当我尝试登录或注册时,我在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 :(得分:1)
,
// Setting up Passport Strategies for Login and SignUp/Registration
login(passport);
signup(passport);
两个路由res.render异步地将响应发送回客户端。因此,当第二条路线尝试发送响应时,已经发送了第一条路线的res.render响应。这就是为什么它会抛出错误,就像在发送标题后不能设置标题一样。
按照下面给出的link示例。