I am attaching 3 project files, please help me to resolve the error. When I am passing Email of the user in postman, its showing error. I am getting "message": "Cannot access 'resetToken' before initialization" in the response of API. I hope this information is not enough for the resolution of the error. If more info is needed, please let me know.
userController.js
const ErrorHander = require("../utils/errorHander");
const catchAsyncErrors = require("../middleware/catchAsyncErrors");
const User = require("../models/userModel");
const sendToken = require("../utils/jwtToken")
const sendEmail = require("../utils/sendEmail")
// Register a User
exports.registerUser = catchAsyncErrors(async(req, res, next) =>
{
const {name, email, password} = req.body;
const user = await User.create
({
name,
email,
password,
avatar:
{
public_id: "This is a sample id",
url: "profilepicUrl",
},
});
const token = user.getJWTToken();
sendToken(user, 201, res);
});
// Login User
exports.loginUser = catchAsyncErrors(async(req, res, next) =>
{
const {email, password} = req.body;
// Checking if user has given password and Email both
if(!email || !password)
{
return next(new ErrorHander("Please enter Email and Password", 400));
}
const user = await User.findOne({email}).select("+password");
if(!user)
{
return next(new ErrorHander("Invalid Email or Password", 401));
}
const isPasswordMatched = await user.comparePassword(password);
if(!isPasswordMatched)
{
return next(new ErrorHander("Invalid Email or Password", 401));
}
sendToken(user, 200, res);
});
// Logout User
exports.logout = catchAsyncErrors(async (req, res, next) =>
{
res.cookie("token", null,
{
expires: new Date(Date.now()),
httpOnly: true,
});
res.status(200).json
({
success: true,
message: "Logged Out",
});
});
// Forgot Password
exports.forgotPassword = catchAsyncErrors(async(req, res, next) =>
{
const user = await User.findOne({email: req.body.email});
if(!user)
{
return next(new ErrorHander("User not found", 404));
}
// Get ResetPassword Token
const resetToken = user.getResetPasswordToken();
await user.save({validateBeforeSave: false});
const resetPasswordUrl = `${req.protocol}://${req.get(
"host"
)}/api/v1/password/reset/${resetToken}`;
const message = `Your password reset token is :- \n\n ${resetPasswordUrl} \n\n If you have
not requested this email then, please ignore it ` ;
try
{
await sendEmail
({
email: user.email,
subject: `Ecommerce Password Recovery`,
message,
});
res.status(200).json
({
success: true,
message: `Email sent to ${user.email} successfully`,
});
}
catch(error)
{
user.getResetPasswordToken = undefined;
user.resetPasswordExpire = undefined;
await user.save({validateBeforeSave: false});
return next(new ErrorHander(error.message, 500));
}
});
sendEmail.js
const nodeMailer = require("nodemailer");
const sendEmail = async(options) =>
{
const transporter = nodeMailer.createTransport
({
service: process.env.SMPT_SERVICE,
auth:
{
user: process.env.SMPT_MAIL,
pass: process.env.SMPT_PASSWORD,
},
});
const mailOptions =
{
from: process.env.SMPT_MAIL,
to: options.email,
subject: options.subject,
text: options.message,
};
await transporter.sendMail(mailOptions);
};
module.exports = sendEmail;
userRoute.js
const express = require("express");
const {registerUser, loginUser, logout, forgotPassword} = require("../controllers/userController");
const router = express.Router();
router.route("/register").post(registerUser);
router.route("/login").post(loginUser);
router.route("/password/forgot").post(forgotPassword);
router.route("/logout").get(logout);
module.exports = router;