POST http://localhost:3000/api/v1/register 500 (Internal Server Error)

Viewed 280

When Cloudinary is not included my Code runs fine on Postman. As I include Cloudinary to in register route to add photos to account, I am getting this error

userAction.jsx

export const register = (userData) => async (dispatch) => {
    try {
      dispatch({ type: REGISTER_USER_REQUEST });
  
      const config = { headers: { "Content-Type": "multipart/form-data" } };
  
      const { data } = await axios.post(`/api/v1/register`, userData, config);
  
      dispatch({ type: REGISTER_USER_SUCCESS, payload: data.user });
    } catch (error) {
      dispatch({
        type: REGISTER_USER_FAIL,
        payload: error.response.data.message,
      });
    }
  };

LoginSignup.jsx

import React, {Fragment,useRef,useState, useEffect} from "react";
import "./LoginSignUp.css";
import Loader from "../layout/Loader/Loader";
import { Link, useNavigate } from "react-router-dom";
import LockOpenIcon from '@mui/icons-material/LockOpen';
import EmailIcon from '@mui/icons-material/Email';
import PersonIcon from '@mui/icons-material/Person';
import img from "../../images/Profile.png";
import {useSelector, useDispatch} from "react-redux";
import {clearErrors, login , register} from "../../actions/userAction.jsx";
import {useAlert} from "react-alert";
 

export default function LoginSignUp(){

    const dispatch = useDispatch();
    const alert = useAlert();
    const navigate = useNavigate();


    const {error,loading,isAuthenticated} = useSelector((state)=>state.user);

    const loginTab=useRef(null);
    const registerTab = useRef(null);
    const switcherTab = useRef(null);

    const [loginEmail,setLoginEmail] = useState("");
    const [loginPassword,setLoginPassword] = useState("");

    const [user,setUser] = useState({
        name:"",
        email:"",
        password:"",
    });

    const {name,email,password} = user;

    const [avatar, setAvatar] = useState(img);
    const [avatarPreview, setAvatarPreview] = useState(img);

    function loginSubmit(e){
        e.preventDefault();
        dispatch((login(loginEmail,loginPassword)));
    }

    function registerSubmit(e){
        e.preventDefault();
        
        const myForm = new FormData();

        myForm.set("name",name);
        myForm.set("email",email);
        myForm.set("password",password);
        myForm.set("avatar",avatar);

        dispatch(register(myForm));
    }

    function registerDataChange(e){
        if(e.target.name==="avatar"){
            const reader = new FileReader();
            reader.onload = ()=>{
                if(reader.readyState===2){
                    setAvatarPreview(reader.result);
                    setAvatar(reader.result);
                }
            };

            reader.readAsDataURL(e.target.files[0]);
        } else {
            setUser({...user, [e.target.name]:e.target.value});
        }
    }

    useEffect(()=>{
        if(error){
            alert.error(error);
            dispatch(clearErrors());
        }
        if(isAuthenticated){
            navigate(`/account`);
        }
    },[dispatch,error,alert,isAuthenticated,navigate]);

    const switchTabs = (e, tab) => {
        if (tab === "login") {
          switcherTab.current.classList.add("shiftToNeutral");
          switcherTab.current.classList.remove("shiftToRight");
    
          registerTab.current.classList.remove("shiftToNeutralForm");
          loginTab.current.classList.remove("shiftToLeft");
        }
        if (tab === "register") {
          switcherTab.current.classList.add("shiftToRight");
          switcherTab.current.classList.remove("shiftToNeutral");
    
          registerTab.current.classList.add("shiftToNeutralForm");
          loginTab.current.classList.add("shiftToLeft");
        }
      };

    return(
        <Fragment>
            {loading ? <Loader/> : (
                <Fragment>
                    <div className="LoginSignUpContainer">
                        <div className="LoginSignUpBox">
                            <div>
                                <div className="login_signUp_toggle">
                                    <p onClick={(e)=>switchTabs(e,"login")}>Login</p>
                                    <p onClick={(e)=>switchTabs(e,"register")}>Register</p>
                                </div>
                                <button ref={switcherTab}></button>
                            </div>
                            <form
                                className="signUpForm"
                                ref={registerTab}
                                encType="multipart/form-data"
                                onSubmit={registerSubmit}
                            >
                                <div className="signUpName">
                                <PersonIcon />
                                <input
                                    type="text"
                                    placeholder="Name"
                                    required
                                    name="name"
                                    value={name}
                                    onChange={registerDataChange}
                                />
                                </div>
                                <div className="signUpEmail">
                                <EmailIcon />
                                <input
                                    type="email"
                                    placeholder="Email"
                                    required
                                    name="email"
                                    value={email}
                                    onChange={registerDataChange}
                                />
                                </div>
                                <div className="signUpPassword">
                                <LockOpenIcon />
                                <input
                                    type="password"
                                    placeholder="Password"
                                    required
                                    name="password"
                                    value={password}
                                    onChange={registerDataChange}
                                />
                                </div>

                                <div id="registerImage">
                                <img src={avatarPreview} alt="Avatar Preview" />
                                <input
                                    type="file"
                                    name="avatar"
                                    accept="image/*"
                                    onChange={registerDataChange}
                                />
                                </div>
                                <input type="submit" value="Register" className="signUpBtn" />
                            </form>
                        </div>
                    </div>
                </Fragment>
            )}
        </Fragment>
    );
}

userController.jsx

exports.RegisterUser = catchAsyncErrors( async (req,res,next)=>{

    // const myCloud = await cloudinary.v2.uploader.upload(req.body.avatar,{
    //   folder: "avatars",
    //   width: 150,
    //   crop:"scale",
    // });

    const {name,email,password} = req.body;

    const user = await User.create({
        name,
        email,
        password,
        avatar: {
            public_id:"myCloud.public_id",
            url: "myCloud.secure_url",
        }
    });

    sendToken(user,201,res);
});
  1. I have an id on Cloudinary and imported its Name, API_KEY, API_SECRET
  2. Backend code works well on postman without Cloudinary
1 Answers

In Postman you are not adding image. But in client side login form, you are adding image alongside other data.

In backend you are getting email, name, password from req.body.But image data will be available in req.file.

As an example

    if (req.file) {
      const avatar= req.file.originalName;
      req.body = { ...req.body, avatar};
    }

await Model.create(req.body);
Related