0

I am new to nodejs. I have been trying to create a simple login and register system using mongodb and express. I have created the entire app but with one error:

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

When I register, the user is added to the database. And it is redirected to /login but when I login then I get this error:

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)

How could I resolve this issue? Thanks.

EDIT: I know that there are many questions with the same title but there problems are different. This error is caused by many different situations and my situation is different from others. I have a problem of redirects whereas other questions have problems of ending a response.

Mohammad Areeb Siddiqui
  • 9,795
  • 14
  • 71
  • 113

1 Answers1

0

You should use return response.<method>. For example, return response.redirect().

Also, response.end() might be helpful.

diegoaguilar
  • 8,179
  • 14
  • 80
  • 129