I have created small book library application as assignment for university in NodeJs. I created a basic authentication for users, the problem is when I register a user and then redirect to the books page I recive 500 status code "Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client"
. The code works and it redirects to the login page but I always receive this bug.
//route file
var express = require('express');
var router = express.Router();
var jwtHelper = require('../helpers/jwt-helper');
var authController = require("../controllers/auth-controller");
router.get("/login", authController.login);
router.post('/login', authController.accessUser);
router.get("/register", authController.register)
router.post("/register", authController.addUser);
router.get('/logout', authController.logout);
module.exports = router;
//controller file
exports.register = (req, res) => {
let formData = {};
res.render('register', {
title: 'books',
errMsg: {
valid: false
},
formData
});
}
exports.addUser = async (req, res) => {
const formData = validateRegisterForm(req.body);
if (formData.valid) {
const check = await authService.checkIfExists(formData.email.value);
if (check) {
res.render('register', {
title: 'books',
formData,
errMsg: {
valid: true,
msg: 'User already exists'
}
});
} else {
let input = {
name: formData.name.value,
email: formData.email.value,
password: await authService.cryptPassword(formData.psw.value)
};
await authService.addUser(input);
let user = await authService.getByEmail(input.email);
const token = jwtHelper.generateAccessToken(user);
delete(user.password);
res.cookie('authorization', 'Bearer ' token).redirect('/api/books');
}
}
res.render('register', {
title: 'books',
formData: formData,
errMsg: {
valid: false
}
});
}
//form validation
function validateRegisterForm(body){
let name = body.name.replace(/(["'])/g, "\\$1");
let email = body.email.replace(/(["'])/g, "\\$1");
let psw = body.psw;
const emailTest = /^(([^<>()[\]\\.,;:\s@"] (\.[^<>()[\]\\.,;:\s@"] )*)|(". "))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9] \.) [a-zA-Z]{2,}))$/;
const numbersPsw = /[0-9]/g;
const upperCaseLetters = /[A-Z]/g;
const lowerCaseLetters = /[a-z]/g;
let formData = {
valid: true,
name: {
value: name
},
email: {
value: email
},
psw: {
value: psw
}
};
if(!name || name.length<2){
formData.name = {
value: name,
valid: false,
err: 'Name not valid'
};
formData.valid = false;
}
if(!email || emailTest.test(String(email).toLowerCase()) == false){
formData.email = {
value: email,
valid: false,
err: 'Email not valid'
};
formData.valid = false
}
if(!psw || psw.length < 6 || !psw.match(upperCaseLetters) || !psw.match(lowerCaseLetters) || !psw.match(numbersPsw)){
formData.psw = {
value: psw,
valid: false,
err: 'Password invalid'
};
formData.valid = false;
}
return formData;
}
CodePudding user response:
add return keyword in every response statment like
return res.render('register', {
title: 'books',
formData: formData,
errMsg: {
valid: false
}
});
CodePudding user response:
//the return statement should fix it
return res.render('register', { title: 'books', formData errMsg: { valid: false } });