Eunice Chia
Eunice Chia

Reputation: 355

Can't set headers after they are sent error

In my app.js I do this

app.use(function(req, res, next){

  if(!req.user){
    return res.redirect('/login_');
  }
  next();
})

I don't see anything wrong and in route/index.js I do

router.get('/login_', function(req, res) {
    res.render('login', { user : req.user });
});

But I got an error. I know this is caused by the request is not ended but what's wrong with my code above? clueless with this error.

Full code of route/index.js

var express = require('express');
var passport = require('passport');
var Account = require('../models/account');

var router = express.Router();

var multer = require('multer');
var storage = multer.diskStorage({
    destination: function (req, file, cb) {
        cb(null, 'public/uploads')
    }
})

var upload = multer({ storage: storage })
var Photo = require('../models/photos');

router.get('/', function(req, res, next) {
  if(req.user){
    res.redirect('/'+req.user.username+'/screen');
  }else{
    res.redirect('/login_');
  }
});

router.get('/:username/screen', function(req, res, next) {
  res.render('screen', { user : req.user });
});

router.get('/:username', function(req, res, next) {
  var excludes = ["/login_", "/register_","/logout_"];
  if (excludes.indexOf(req.originalUrl) > -1){
    return next();
  }else{
    res.render('upload_photo');
  }
});

router.post('/:username', upload.any(), function(req, res, next) {

    var excludes = ["/login_", "/register_","/logout_"];
    if (excludes.indexOf(req.originalUrl) > -1){
      return next();
    }else{
      var photo = new Photo({
        photo:req.files[0].filename,
        caption:req.body.caption
      });
       
      photo.save(photo);
      res.sendStatus(200);
    }

  	
});

router.get('/:username/manager', function(req, res, next) {
  Photo.getAllPhotos(function(err,result){
    var headers = req.headers.host;
    var pathname = '128.199.128.108:3000';
    
    if(headers.indexOf('localhost') > -1){
      pathname = 'localhost:3000'
    }

    res.render('manager',{pathname:pathname,photos:result});
  });
});

//* passport for register/login_ *//
router.get('/register_', function(req, res) {
    res.render('register', { });
});

router.post('/register_', function(req, res) {
    Account.register(new Account({ username : req.body.username }), req.body.password, function(err, account) {
        if (err) {
            return res.render('register', { account : account });
        }

        passport.authenticate('local')(req, res, function () {
            res.redirect('/');
        });
    });
});

router.get('/login_', function(req, res) {
    res.render('login', { user : req.user });
});

router.post('/login_', passport.authenticate('local'), function(req, res) {
    res.redirect('/');
});

router.get('/logout_', function(req, res) {
    req.logout();
    res.redirect('/login_');
});



module.exports = router;

Upvotes: 0

Views: 53

Answers (1)

Elentriel
Elentriel

Reputation: 1237

You are printing something before this line. Either trace that, or instruct your server to cache some of the output to the user. (if the server does not display anything to the user, headers can be sent, even if code tries to print something before) However that is general knowledge, not familiar with node.js

Upvotes: 0

Related Questions