Express.js error: Cannot set headers after they are sent to the client

Viewed 43

UPDATE:

I figured out the issue. It was really a noob mistake, I'm still laughing at myself. I put a app.get(':/id') above my app.get('/login') so it was sending more than one header.


Not sure why I'm getting this error. Whenever I try to use the 'login' route, the server crashes. I even deleted everything from the login route and put a simple res.send('test') in it's place but it still didn't work. I read that this error is caused by double callbacks, but I can't find a double callback anywhere. For some reason I get three errors too.

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:372:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:794:10)
    at ServerResponse.contentType (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:624:15)
    at ServerResponse.send (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:149:14)
    at done (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:1035:10)
    at C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs-mate\lib\index.js:356:7
    at tryHandleCache (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs\lib\ejs.js:280:5)
    at Object.exports.renderFile (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs\lib\ejs.js:491:10)
    at renderFile (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs-mate\lib\index.js:298:7)
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:372:5)
    at ServerResponse.setHeader (node:_http_outgoing:576:11)
    at ServerResponse.header (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:794:10)
    at ServerResponse.contentType (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:624:15)
    at ServerResponse.send (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:149:14)
    at done (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:1035:10)
    at C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs-mate\lib\index.js:356:7
    at tryHandleCache (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs\lib\ejs.js:280:5)
    at Object.exports.renderFile (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs\lib\ejs.js:491:10)
    at renderFile (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs-mate\lib\index.js:298:7)
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:372:5)
    at ServerResponse.header (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:794:10)
    at ServerResponse.contentType (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:624:15)
    at ServerResponse.send (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:149:14)
    at done (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\express\lib\response.js:1035:10)
    at C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs-mate\lib\index.js:356:7
    at tryHandleCache (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs\lib\ejs.js:280:5)
    at Object.exports.renderFile (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs\lib\ejs.js:491:10)
    at renderFile (C:\Users\natha\Documents\Coding\Menu Planner\node_modules\ejs-mate\lib\index.js:298:7)

This is the code I have:

const express = require('express');
const app = express();
const mongoose = require('mongoose');
const passport = require('passport');
const passportLocal = require('passport-local');

const {isLoggedIn} = require('./middleware');

mongoose.connect('mongodb://localhost:27017/menu-planner');
const User = require('./models/user');

app.use(passport.session());
passport.use(new passportLocal(User.authenticate()));

passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());

app.get('/home', isLoggedIn, (req,res) => {
    res.render('home', {user: req.user});
})

app.get('/login', (req,res) => {
    if (req.isAuthenticated()) {
        res.redirect('/home')
    } else {
        res.render('login');
    }
})

app.listen(3000);

Here's my middleware code:

module.exports.isLoggedIn = (req,res,next) => {
    if (!req.isAuthenticated()) {
        return res.redirect('/login');
    }
    next();
}
0 Answers
Related