Search code examples
javascriptreactjsexpresscreate-react-appfetch-api

Proxy server to my express server is not working in my React app


I am running my react app at port 3000 & express server at port 4000 , on the same local machine.

In my react app , using fetch api i am sending my registration form data to my express server at '/register' route-

const response = await fetch('/register' , {
        method: 'POST',
        headers : {
            "Content-Type" : "application/json"
        },
        body: JSON.stringify({
            name: username,
            email : useremail,
            phone : userphone,
            work : userwork,
            password: userpassword,
            cpassword : usercpassword
        })
    });

    const data = await response.json();

    if(data.status === 422 || !data){
        window.alert("Invalid registration");
        console.log("Invalid registration");
    }else{
        window.alert("registration successful");
        console.log("registration successful");

       //using useHistory hook
        history.push('/login');
    }

}

And in my express server , i am doing a post method at '/register' route and storing the form data in my database -

router.post('/register' , (req,res)=>{
    
    const {name, email, phone, work, password, cpassword} = req.body;

    //we are checking if any of the inputs are empty or not
    if(!name || !email || !phone || !work || !password || !cpassword){
        return res.status(422).send('Please Fill All The Fields');
    }

    //we are observing if a user already registered or not by checking it's email
    User.findOne({email : email})
            .then((userExist) =>{
                    if(userExist){
                        return res.status(422).send('Email already exists');
                    }else if(password !== cpassword){
                        return res.status(422).send('Passwords are not matching');
                    }

                    //if the email dont exist , that means the user is new and we will store it's data in the DB
                    const user = new User({
                        name : name,
                        email : email,
                        phone : phone,
                        work : work,
                        password : password,
                        cpassword : cpassword,
            });

                //saved the stored data in the DB
            user.save()
            .then(()=>{
                res.status(201).send('User registered Successfully')
            })
            .catch((err)=>{
                res.status(500).send(err);
            })

    }).catch((err)=>{
        console.log(err);
    })
})

In package.json filee for my react app , i added the proxy to localhost:4000(express server defined at port 4000) -

{
  "name": "frontend",
  "version": "0.1.0",
  "private": true,
  "proxy" : "http://localhost:4000",
  "dependencies": {
    "@testing-library/jest-dom": "^5.11.10",
    "@testing-library/react": "^11.2.6",
    "@testing-library/user-event": "^12.8.3",
    "bootstrap": "^5.0.0-beta3",
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "react-router-dom": "^5.2.0",
    "react-scripts": "4.0.3",
    "web-vitals": "^1.1.1"
  }, 
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject"
  },
  "eslintConfig": {
    "extends": [
      "react-app",
      "react-app/jest"
    ]
  },
  "browserslist": {
    "production": [
      ">0.2%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}

And in my firefox console i am facing this error -

enter image description here enter image description here enter image description here

And in the browser under network tab i am getting this -

enter image description here

I am facing a 422 status error.I have been trying to solve this issue for the past 5 hours but after reading many solutions & articles i am not able to solve this issue of mine.I also checked similar questions on stackoverflow but the solution to them didnt worked.Basically , i am trying to send my registration form data from my react app to my express server by defining a proxy in the package.json file(of react app) , but i dont know why react is still considering it's own port 3000 instead of the server port 4000.Please help me solve this problem.Thanks a lot.


Solution

  • You can see the proxy is not working by the url localhost:3000/register. The proxy setting only works in development mode and that is not certain as well. You have two options:

    Either write the whole url in your fetch requests or make a fetch interceptor to add the 'localhost:4000' before every API call.

    P.S. And a third option: You can use axios instead of fetch if you don't want to write a custom fetch interceptor. Axios instances are pretty easy to do: https://medium.datadriveninvestor.com/axios-instance-interceptors-682868f0de2d