Vivek V Dwivedi Vivek V Dwivedi - 1 year ago 165
Node.js Question

Can't set headers after they are sent in express js

I looked around at previous answers to this question, but I don't understand why is this error coming up if there are

in multiple paths.

My code is something like this (expressjs 4.13):

var user ={
username: "some",
password: "a"
}'/login', authenticate, function (req, res) {
//if it passes the middleware, send back the user

var token = jwt.sign({
username: user.username
}, jwtSecret);
token: token,
user: user

function authenticate(req, res, next) {
var body = req.body;
var username = body.username, password = body.password;

//if nothing is sent
if(!username || !password){
res.status(400).end('Must send a user and pass');

//if incorrect credentials are sent
if(username !== user.username || password !== user.password){
res.status(401).end("Incorrect credentials");

//if it reaches here, it means credentials are correct

When I don't send anything from my frontend, I am getting the 400 and error message, but my server shows this:

POST /apis/auth/login 401 0.841 ms - -
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:346:11)
at ServerResponse.header (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/response.js:718:10)
at ServerResponse.json (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/response.js:246:10)
at ServerResponse.send (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/response.js:151:21)
at /home/vivek/dev/qwiksplit/jsback/app.js:81:9
at Layer.handle_error (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/layer.js:71:5)
at trim_prefix (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/index.js:310:13)
at /home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/index.js:280:7
at Function.process_params (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/index.js:330:12)
at next (/home/vivek/dev/qwiksplit/jsback/node_modules/express/lib/router/index.js:271:10)

I am not sure how I am setting headers after a response is sent.

Answer Source

Make sure to return!

return res.status(400).end('Must send a user and pass');
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download