"Can't set headers after they are sent" and empty post request body

Ryan Aleksander

I've been following a tutorial for a login/register authentication application. I keep getting the error "Can't set headers after they are sent" whenever I send POST requests. I tried to console.log the request body and it were empty. I don't know where I did wrong. Please help.

users.js

var express = require('express');
var router = express.Router();
var User = require('../models/User')

/* GET users listing. */
router.get('/', function(req, res, next) {
  res.send('respond with a resource');
});

router.get('/register', function(req, res, next) {
  res.render('register', {title:'Register'});
});

router.get('/login', function(req, res, next) {
  res.render('login', {title: 'Login'})
});

router.post('/register', function(req, res, next) {
  var name = req.body.name;
  var email = req.body.email;
  var username = req.body.username;
  var password = req.body.password;
  var password2 = req.body.password2;

  if (req.files && req.files.profileimage) {
    console.log('Uploading file...');

    var profileimageOriginalName = req.files.profileimage.originalname;
    var profileimageName = req.files.profileimage.name;
    var profileimageMime = req.files.profileimage.mimetype;
    var profileimageExt = req.files.profileimage.extension;
    var profileimageSize = req.files.profileimage.size;
    var profileimagePath = req.files.profileimage.path;
  } else {
    var profileimageName = 'noimage.png'
  }

  req.checkBody('name', 'Name field is required').notEmpty();
  req.checkBody('email', 'Email field is required').notEmpty();
  req.checkBody('email', 'Email field is not valid').isEmail();
  req.checkBody('username', 'Username field is required').notEmpty();
  req.checkBody('password', 'Password field is required').notEmpty();
  req.checkBody('password2', 'Password does not match').equals(req.body.password);
  var errors = req.validationErrors()

  if (errors) {
    res.render('register', {
      errors: errors,
      name: name,
      email: email,
      username: username,
      password: password,
      password2: password2
    });
  } else {
    var newUser = new User({
      name: name,
      email: email,
      username: username,
      password: password,
      profileimage: profileimageName
     })
  }

  User.createUser(newUser, function(err, user) {
    if (err) throw err;
    console.log(user);
  })

  req.flash('sucess', 'You are now registered and may login');
  res.location('/');
  res.redirect('/');
})
module.exports = router;

app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var session = require('express-session');
var passport = require('passport');
var LocalStrategry = require('passport-local').strategy;
var bodyParser = require('body-parser');
var expressValidator = require('express-validator');
var flash = require('connect-flash');
var multer = require('multer')
var mongo = require('mongodb');
var mongoose = require('mongoose');
var db = mongoose.connection

var routes = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// handle file upload
var upload = multer({dest: './uploads'});

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.use(session({
  secret: 'secret',
  saveUninitialized: true,
  resave: true
}))

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

app.use(expressValidator({
  errorFormatter: function(param, msg, value) {
      var namespace = param.split('.')
      , root    = namespace.shift()
      , formParam = root;

    while(namespace.length) {
      formParam += '[' + namespace.shift() + ']';
    }
    return {
      param : formParam,
      msg   : msg,
      value : value
    };
  }
}));


app.use(flash())
app.use(function (req, res, next) {
  res.locals.messages = require('express-messages')(req, res);
  next();
});

app.use('/', routes);
app.use('/users', users);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});


module.exports = app;

UPDATE: If I remove the validator codes, the error will be gone, but the post request body still empty

UPDATW 2: Error log

POST /users/register 500 26.552 ms - 2629
Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11)
    at ServerResponse.header (F:\Projects\nodeauth\node_modules\express\lib\response.js:718:10)
    at ServerResponse.send (F:\Projects\nodeauth\node_modules\express\lib\response.js:163:12)
    at done (F:\Projects\nodeauth\node_modules\express\lib\response.js:957:10)

    at Object.exports.renderFile (F:\Projects\nodeauth\node_modules\jade\lib\index.js:374:12)
    at View.exports.__express [as engine] (F:\Projects\nodeauth\node_modules\jade\lib\index.js:417:11)
    at View.render (F:\Projects\nodeauth\node_modules\express\lib\view.js:126:8)
    at tryRender (F:\Projects\nodeauth\node_modules\express\lib\application.js:639:10)
    at EventEmitter.render (F:\Projects\nodeauth\node_modules\express\lib\application.js:591:3)
    at ServerResponse.render (F:\Projects\nodeauth\node_modules\express\lib\response.js:961:7)
    at F:\Projects\nodeauth\app.js:99:7
    at Layer.handle_error (F:\Projects\nodeauth\node_modules\express\lib\router\layer.js:71:5)
    at trim_prefix (F:\Projects\nodeauth\node_modules\express\lib\router\index.js:310:13)
    at F:\Projects\nodeauth\node_modules\express\lib\router\index.js:280:7
    at Function.process_params (F:\Projects\nodeauth\node_modules\express\lib\router\index.js:330:12)
    at next (F:\Projects\nodeauth\node_modules\express\lib\router\index.js:271:10)
    at Layer.handle_error (F:\Projects\nodeauth\node_modules\express\lib\router\layer.js:67:12)
    at trim_prefix (F:\Projects\nodeauth\node_modules\express\lib\router\index.js:310:13)
    at F:\Projects\nodeauth\node_modules\express\lib\router\index.js:280:7
    at Function.process_params (F:\Projects\nodeauth\node_modules\express\lib\router\index.js:330:12)
    at Immediate.next (F:\Projects\nodeauth\node_modules\express\lib\router\index.js:271:10)
    at Immediate.<anonymous> (F:\Projects\nodeauth\node_modules\express\lib\router\index.js:618:15)
avck

You can not set the header after it has been sent to client.

res.render sends the sends the response when there is error. After that again you are trying to send the headers via res.location and res.redirect.

Move the res.redirect to the else block.

  var multer = require('multer');
  var upload = multer(); 
  router.post('/register', upload.array(), function(req, res, next) {
  var name = req.body.name;
  var email = req.body.email;
  .................. 
  if (errors) {
    res.render('register', {
     errors: errors,
     name: name,
     email: email,
     username: username,
     password: password,
     password2: password2
  });
  } else {
   var newUser = new User({
    name: name,
    email: email,
    username: username,
    password: password,
    profileimage: profileimageName
   })
  //now this is also in the else block
   User.createUser(newUser, function(err, user) {
    if (err) throw err;
    console.log(user);
  })

  req.flash('sucess', 'You are now registered and may login');
  res.location('/');
  res.redirect('/');
  //till here so you don't send response twice
}


})

Collected from the Internet

Please contact [email protected] to delete if infringement.

edited at
0

Comments

0 comments
Login to comment

Related

From Dev

Can't set headers after they are sent after first request only

From Dev

Error: Can't set headers after they are sent in loop multiple request

From Dev

http request with node.js fail Can\'t set headers after they are sent

From Dev

SailsJS - Nodejs Https-Request. Can't set headers after they are sent

From Dev

Node js : HTTP POST : Error: Can't set headers after they are sent

From Dev

Can't set headers after they are sent on express

From Dev

Nodejs: Can't set headers after they are sent

From Dev

Can`t set headers after they are sent

From Dev

Restifyapi: Can't set headers after they are sent

From Java

Error: Can't set headers after they are sent to the client

From Dev

Routes error: Error: Can't set headers after they are sent

From Dev

Express redirect error: can't set headers after they are sent

From Dev

res.json Can't set headers after they are sent

From Dev

Sails.js Can't set headers after they are sent

From Dev

Streaming data from Mongoose - "Can't set headers after they are sent"

From Dev

res.send Can't set headers after they are sent

From Dev

How to deal with Can't set headers after they are sent

From Dev

Error: Can't set headers after they are sent - Node.js

From Dev

NodeJS Unhandled rejection error: Can't set headers after they are sent

From Dev

NodeJS Error - Can't set headers after they are sent

From Dev

Async response - can't set headers after they are sent

From Dev

Nodejs stream (Error: Can't set headers after they are sent)

From Dev

can't set headers after they sent in node js

From Dev

sailsjs policy causing Can't set headers after they are sent error

From Dev

Streaming data from Mongoose - "Can't set headers after they are sent"

From Dev

Error: Can't set headers after they are sent if else statement

From Dev

Express / node.js Can't set headers after they are sent

From Dev

Error: Can't set headers after they are sent using passportjs/Express

From Dev

Getting Error with express : Can't set headers after they are sent

Related Related

  1. 1

    Can't set headers after they are sent after first request only

  2. 2

    Error: Can't set headers after they are sent in loop multiple request

  3. 3

    http request with node.js fail Can\'t set headers after they are sent

  4. 4

    SailsJS - Nodejs Https-Request. Can't set headers after they are sent

  5. 5

    Node js : HTTP POST : Error: Can't set headers after they are sent

  6. 6

    Can't set headers after they are sent on express

  7. 7

    Nodejs: Can't set headers after they are sent

  8. 8

    Can`t set headers after they are sent

  9. 9

    Restifyapi: Can't set headers after they are sent

  10. 10

    Error: Can't set headers after they are sent to the client

  11. 11

    Routes error: Error: Can't set headers after they are sent

  12. 12

    Express redirect error: can't set headers after they are sent

  13. 13

    res.json Can't set headers after they are sent

  14. 14

    Sails.js Can't set headers after they are sent

  15. 15

    Streaming data from Mongoose - "Can't set headers after they are sent"

  16. 16

    res.send Can't set headers after they are sent

  17. 17

    How to deal with Can't set headers after they are sent

  18. 18

    Error: Can't set headers after they are sent - Node.js

  19. 19

    NodeJS Unhandled rejection error: Can't set headers after they are sent

  20. 20

    NodeJS Error - Can't set headers after they are sent

  21. 21

    Async response - can't set headers after they are sent

  22. 22

    Nodejs stream (Error: Can't set headers after they are sent)

  23. 23

    can't set headers after they sent in node js

  24. 24

    sailsjs policy causing Can't set headers after they are sent error

  25. 25

    Streaming data from Mongoose - "Can't set headers after they are sent"

  26. 26

    Error: Can't set headers after they are sent if else statement

  27. 27

    Express / node.js Can't set headers after they are sent

  28. 28

    Error: Can't set headers after they are sent using passportjs/Express

  29. 29

    Getting Error with express : Can't set headers after they are sent

HotTag

Archive