"message": "Cannot access 'resetToken' before initialization"

Viewed 14

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.

enter image description here

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;
0 Answers
Related