发送后无法发送标头

时间:2015-06-19 07:18:43

标签: node.js mongodb express

我是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)

我该如何解决这个问题?感谢。

编辑:我知道有很多相同标题的问题,但问题有所不同。这个错误是由许多不同的情况引起的,我的情况与其他情况不同。我有重定向问题,而其他问题有结束回复的问题。

1 个答案:

答案 0 :(得分:0)

您应该使用return response.<method>。例如,return response.redirect()

此外,response.end()可能会有所帮助。