Hey guys I did a project that simulates Netflix and I'm making it using react for the front end and Node.js express.js for the Back end. When I run the react code, the paths of each page are working. What I mean when I say "paths" is paths like "http://localhost:3000/" and "http://localhost:3000/login". However, when I start running the server-side code and then I refresh the page, I get this message: "Cannot GET /" or "Cannot GET /login". I think I have a problem about handling the GET request on my server, but my POST requests are handled pretty well. I will provide you my home page code component and login page code component and server-side code, Also App component code and project file structure below:
(react code)home page:
import React,{useState} from 'react';
import PlayArrowIcon from '@mui/icons-material/PlayArrow';
import InfoIcon from '@mui/icons-material/Info';
import Header from './header.jsx';
import Footer from './footer.jsx';
import List from './list.jsx';
import axios from "axios";
import { useEffect } from 'react';
export default function Home(){
const[movies,SetMovies] = useState([]);
const[randomPoster,SetrandomPoster] = useState({});
const type="";
useEffect(()=>{
const fetch = async()=>{
await axios.get("https://api.themoviedb.org/3/movie/upcoming?api_key=c2ca0c1d4432e9a9db70a5b7154e2053").then(async data=> { const d = await data.data.results; SetMovies(d)}).catch(err => console.log(err));
}
fetch();
},[]);
const fetch2 = async()=>{
const index = Math.round(Math.random() * movies.length-1);
let r = movies[2];
const image = "https://image.tmdb.org/t/p/w500"+ r.backdrop_path
return {image :image, title: r.title, overview: r.overview}
}
const temp = fetch2();
temp.then(async res=>{
SetrandomPoster(res);
})
return(
<>
<Header/>
<div className='home'>
<div className='imgStuff'>
{type&&( <>
<div id='genre'>
<h1>{type}</h1>
<select >
<option value=""></option>
<option value=""></option>
<option value=""></option>
</select>
</div>
</>)}
<img className= "poster" src={randomPoster.image} alt="" />
<div className='texts'>
<div className='title'>
<h1>Watch {randomPoster.title}</h1>
<h3>{randomPoster.overview}</h3>
</div>
<div className='btns'>
<button className='Playbtn'><PlayArrowIcon id= "play"/>Play</button>
<button className='Infobtn'><InfoIcon id = "info"/>Info</button>
</div>
</div>
</div>
<List name="Popular"/>
<List name="Trending"/>
<List name="Comingup"/>
<List name="Playing now"/>
</div>
<Footer/>
</>
);
}
(react code)login page:
import React, { useState } from "react";
import LoginHeader from './LoginHeader';
export default function Login(){
// useState hook to store the input values
const [username, setUsername] = useState("");
const [password, setPassword] = useState("");
const handlePost = () => {
fetch('http://localhost:3000/login', {
method: "POST",
headers: {
'Content-type': 'application/json'
},
body: {
username: username,
password: password
}
})
.then((response) => response.json())
.then((result) => {
console.log(result)
})};
return (
<>
<LoginHeader/>
<div className="login">
<div className="formContainer">
<form className="form" onSubmit={handlePost}>
<h2 className="textSginin">Sign in</h2>
<div >
<input className="username" type="text" onChange={(e) => setUsername(e.target.value)}/>
<input className ="password"type="password" onChange={(e) => setPassword(e.target.value)}/>
</div>
<div className="buttonContainer">
<input id="submit" type="submit" value={"login"}/>
<div className="spanFlex">
<div className="checkboxContainer">
<input id = "checkbox" type="checkbox"/>Remeber me?
</div>
<span id="help">Need help?</span>
</div>
</div>
</form>
<div className="signupAlert" >
<h2>New to Netflix? <span>Sign up now.</span></h2>
<p>This page is protected by Google reCAPTCHA to ensure you're not a bot. <span>Learn more.</span></p>
</div>
</div>
</div>
</>
);
}
server-side:
const express = require("express");
const bodyParser = require("body-parser");
const mongoose = require("mongoose");
const app = express();
app.use(bodyParser.json());
app.use(
bodyParser.urlencoded({
extended: true,
})
);
app.post("/login", (req,res)=>{
const username = req.body.username;
const password = req.body.password;
console.log(username +" "+ password);
res.status(200).send("ok");
})
app.listen(3000,()=>{
console.log("server connected on port 3000");
})
App component code
import '../style/App.css';
import { BrowserRouter as Router, Routes , Route } from "react-router-dom";
import Home from './home.jsx';
import Login from './login'
import React from 'react';
function App() {
return(
<div>
<Router>
<Routes >
<Route path="/" exact element={<Home/> } />
<Route path="/login" element={ <Login/>} />
</Routes >
</Router>
</div>
);
}
export default App;
Project file structure
I guess my mistake was running the react project and the server on the same port 3000, I have fixed that by running the server code on other port like 3001