Categories
express express-jwt mongoose node.js passport.js

ERR_HTTP_HEADERS_SENT: Cannot set headers after they are sent to the client

I’m facing this weird issue in NodeJS when using with Passport.js, Express and Mongoose. Basically, I get an error saying “Cannot set headers after they are sent to the client” even though I don’t send more than one header.

I’ve read other posts and tried them out as well, and none of them worked.

I’ve dug through github issues and I can’t seem to find a solution. I get the problem that this error is triggered when I send multiple response headers, but the fact is that I am not sending multiple headers. It seems just weird.

This is my stack trace:

(node:9236) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.

Server Running on port 5000

MongoDB Connected Error

[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the
client

  at validateHeader (_http_outgoing.js:503:11)

   at ServerResponse.setHeader (_http_outgoing.js:510:3)

   at ServerResponse.header (/Users/lourdesroashan/code/github/devlog/node_modules/express/lib/response.js:767:10)

   at ServerResponse.json (/Users/lourdesroashan/code/github/devlog/node_modules/express/lib/response.js:264:10)

   at Profile.findOne.then.profile (/Users/lourdesroashan/code/github/devlog/routes/api/profile.js:27:30)

   at <anonymous>

This is my server code:

router.get("/userprofile", passport.authenticate('jwt', { session: false }), (req, res) => {
Profile.findOne({ user: req.user.id }).then(profile => {
if (!profile) {
return res.status(404).json({ error: "No Profile Found" });
}
else {
res.json(profile);
}
}).catch(err => {
console.log(err);
})
});

I understand what the error means, but from what I know, I don’t think I am sending multiple headers, I even checked by console.log that only one of the blocks is run.

Thank you so much in advance! 🙂

Full Code at: https://github.com/lourdesr/devlog

EDIT:

I figured it out. It was a problem in my passport.js while trying to get the authenticated user. I forgot to use ‘return’ on the ‘done’ method, which had caused it. Just added the return statement and it worked!