Whenever i try to call signIn function i get error as:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at new NodeError (node:internal/errors:371:5)
at ServerResponse.setHeader (node:_http_outgoing:576:11)
at ServerResponse.header (/Users/nitesh/Desktop/finisterre/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/Users/nitesh/Desktop/finisterre/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Users/nitesh/Desktop/finisterre/node_modules/express/lib/response.js:267:15)
at /Users/nitesh/Desktop/finisterre/src/controllers/admin/auth-controller.js:66:44
at /Users/nitesh/Desktop/finisterre/node_modules/mongoose/lib/model.js:4960:18
at processTicksAndRejections (node:internal/process/task_queues:78:11)
Emitted 'error' event on Function instance at:
at /Users/nitesh/Desktop/finisterre/node_modules/mongoose/lib/model.js:4962:15
at processTicksAndRejections (node:internal/process/task_queues:78:11) {
code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...
The code that i am trying to execute is for admin signup and signin process. Same function works flawlessly for user route. But for admin it is returning error as cannot set headers and i am getting error as user is not defined in postman, but user is created.
Signup works perfectly but not signin. But same signup and sigin request works without a single warning for user role.Is there any fix for this??
const express = require('express');
const UserModel = require('../../models/user-model');
const jwt = require('jsonwebtoken');
const signUp = function(req, res, next) {
UserModel.findOne({email: req.body.email})
.exec(function(err, user) {
if(user) return res.status(400).json({
message: "Admin already exists"
})
})
const {
email,
password,
firstName,
lastName,
} = req.body;
const user = new UserModel({
username: Math.random().toString(),
email,
password,
firstName,
lastName,
role: 'admin'
});
user.save(function(err, data) {
if(err){
return res.status(400).json({
message: "Something went wrong",
err
});
}
if(data){
return res.status(200).json({
message: "Admin created successfully"
});
}
})
}
const signIn = function(req, res, next) {
UserModel.findOne({email: req.body.email})
.exec(function(err, user) {
if(err){
return res.status(400).json({err})
};
if(user){
if(user.authenticate(req.body.password) && user.role === 'admin'){
const token = jwt.sign({_id: user._id}, process.env.JWT_SECRET,{
expiresIn: process.env.JWT_SECRET_EXPIRATION
});
const {
_id,
firstName,
lastName,
email,
role,
fullName
} = user;
return res.status(200).json({
token,
user: {
_id,
firstName,
lastName,
email,
role,
fullName
},
message: "Admin signed in successfully"
});
}
else{
return res.status(400).json({
message: 'Invalid password'
})
}
}
else{
return res.status(400).json({
message: "Something went wrong"
});
}
})
console.log(user);
}
const profile = function(req, res, next) {
console.log(req.user);
}
//this is middleware, it needs to placed in middlewares directory
const requireSignIn = function(req, res, next) {
const token = req.headers.authorization.split(" ")[1];
const user = jwt.verify(token, process.env.JWT_SECRET);
req.user = user;
next();
}
module.exports = {
signIn,
signUp,
requireSignIn,
profile
}