I have an asynchronous problem here. The forEach
is still running when res.json({ errors });
returns so all the errors aren't picked up. How do I deal with this?
router.post('/new/user', async function (req, res, next) {
const validateEmail = async (email) => {
var re = /^(([^<>()[\]\\.,;:\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,}))$/;
return re.test(email);
};
const reqBody = { email, password };
let errors = {};
Object.keys(reqBody).forEach(async (field) => {
if (field === 'email' && validateEmail(await reqBody[field])) {
errors = { ...errors, [field]: 'Not a valid Email' };
}
console.log(3);
if (field === 'password' && password !== '' && password < 4) {
errors = { ...errors, [field]: 'Password too short' };
}
});
if (Object.keys(errors).length > 0) {
res.json({ errors });
}
}
Use for...of
to loop over the array elements instead and you can use await
.
for(const field of Object.keys(reqBody)){
//Code using await
}