2015-06-19 6 views
0

Я новичок в nodejs. Я пытаюсь создать простую систему регистрации и регистрации, используя mongodb и express. Я создал все приложение, но с одной ошибкой:Не удается отправить заголовки после их отправки

var express = require('express') 
    , passport = require('passport') 
    , util = require('util') 
    , LocalStrategy = require('passport-local').Strategy; 

var bodyParser = require('body-parser'); 
var cookieParser = require('cookie-parser'); 
var session = require('express-session'); 
//var flash = require('connect-flash'); 

var monk = require('monk'); 
var db = monk('localhost:27017/loginsystem'); 
var collection = db.get('messagescollection'); 


function findById(id, fn) { 
    var collection = db.get('messagescollection'); 
    collection.findOne({ _id: id }).on('success', function (doc) { 
    fn(null, doc); 
    }); 
} 

function findByUsername(username, fn) { 
    collection.findOne({ username: username }).on('success', function(doc) { 
    return fn(null, doc); 
    }); 
    return fn(null, null); 
} 


var app = express(); 
app.use(bodyParser.json()); // for parsing application/json 
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded 

app.use(function(req,res,next){ 
    req.db = db; 
    next(); 
}); 

app.use(cookieParser()); 
app.use(session({ 
    secret: 'keyboard cat' 
hours 
})); 

app.use(passport.initialize()); 
app.use(passport.session()); 

passport.serializeUser(function(user, done) { 
    console.log("user",user); 
    done(null, user._id); 
}); 

passport.deserializeUser(function(id, done) { 
    console.log(id,"id"); 
    findById(id, function (err, user) { 
    done(err, user); 
    }); 
}); 

passport.use(new LocalStrategy(
    function(username, password, done) { 
    findByUsername(username, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { return done(null, false, { message: 'Unknown user ' + username }); } 
     if (user.password != password) { return done(null, false, { message: 'Invalid password' }); } 
     return done(null, user); 
    }) 
    } 
)); 

app.use(express.static(__dirname + '/public')); 

app.get('/account', ensureAuthenticated, function(req, res){ 
    res.send(req.user); 
}); 

app.get('/login', function(req, res){ 
    res.redirect("/login.html") //redirect back to homepage 
}); 

app.get('/register', function(req, res) { 
    res.redirect("/register.html") //redirect back to homepage 
}) 

app.post('/login', passport.authenticate('local', { failureRedirect: '/login'}), function(req, res) { 
    console.log("success",req.user); 
    res.redirect('/account'); 
}); 

app.post('/register', function(req, res) { 
    console.log(req.body); 
    // Submit to the DB 
    collection.insert({ 
     "username" : req.body.username, 
     "email" : req.body.email, 
     "password" : req.body.password 
    }, function (err, doc) { 
     if (err) { 
      // If it failed, return error 
      res.send("There was a problem adding the information to the database."); 
     } 
     else { 
      //res.redirect('/account'); 
     } 
    }); 
}); 

app.get('/logout', function(req, res){ 
    req.logout(); 
    res.redirect('/'); 
}); 

app.listen(9000); 

function ensureAuthenticated(req, res, next) { 
    console.log("req.user",req.user,req.session); 
    if (req.isAuthenticated()) { return next(); } 
    res.redirect('/login'); 
} 

Когда я регистрируюсь, пользователь добавляется в базу данных. И это перенаправляется /login, но когда я войти в систему, то я получаю эту ошибку:

Error: Can't set headers after they are sent. 
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11) 
    at ServerResponse.header (/home/mareebsiddiqui/SummerOfCode/loginsystem/node_modules/express/lib/response.js:700:10) 
    at ServerResponse.res.location (/home/mareebsiddiqui/SummerOfCode/loginsystem/node_modules/express/lib/response.js:814:8) 
    at ServerResponse.redirect (/home/mareebsiddiqui/SummerOfCode/loginsystem/node_modules/express/lib/response.js:853:8) 
    at /home/mareebsiddiqui/SummerOfCode/loginsystem/app.js:130:7 
    at Layer.handle [as handle_request] (/home/mareebsiddiqui/SummerOfCode/loginsystem/node_modules/express/lib/router/layer.js:82:5) 
    at next (/home/mareebsiddiqui/SummerOfCode/loginsystem/node_modules/express/lib/router/route.js:110:13) 
    at complete (/home/mareebsiddiqui/SummerOfCode/loginsystem/node_modules/passport/lib/middleware/authenticate.js:243:13) 
    at /home/mareebsiddiqui/SummerOfCode/loginsystem/node_modules/passport/lib/middleware/authenticate.js:250:15 
    at pass (/home/mareebsiddiqui/SummerOfCode/loginsystem/node_modules/passport/lib/authenticator.js:427:14) 

Как я мог решить эту проблему? Благодарю.

EDIT: Я знаю, что есть много вопросов с тем же названием, но там проблемы разные. Эта ошибка вызвана многими различными ситуациями, и моя ситуация отличается от других. У меня проблема с перенаправлением, тогда как другие вопросы имеют проблемы с окончанием ответа.

+0

Возможный дубликат [Node.js Ошибка: невозможно установить заголовки после их отправки] (http://stackoverflow.com/questions/7042340/node-js-error-cant-set-headers-after-they -are-sent) – chridam

+0

@chridam Я видел все остальные вопросы. Ни один из них не касается моей проблемы. –

+2

Внутри вашего логина, попробуйте сделать это 'return res.redirect ('/ account');' –

ответ

0

Вы должны использовать return response.<method>. Например, return response.redirect().

Также response.end() может быть полезен.

+0

Что я должен изменить в своем коде? –

+0

Я сделал небольшое редактирование, чтобы объяснить вам. – diegoaguilar

+0

Не повезло. :/Я изменил каждый res. 'return res. 'но он все еще не работает. : / –