react- express:获取数据时,当用户连接时,可以在重新加载上工作

发布于 2025-01-26 14:36:26 字数 2762 浏览 2 评论 0 原文

我已经使用nodejs/express/mongodb的react部署了我的第一个应用程序,但是我正在通过一个无法找到任何解决方案的错误运行,所以我来这里找到了一些帮助。

这是一个应用:

用户连接后,他可以访问数据,但是如果重新加载页面,则获取不再工作。

这是获取发生的代码:

import './App.css';
import "./index.css"
import React, {useState, useEffect, useRef} from 'react'
import {BrowserRouter as Router, Routes, Route} from 'react-router-dom'
import Register from './components/Register';
import Login from './components/Login'
import Home from './pages/Home';
import Auth from './pages/Auth';
import Movie from './pages/Movie'
import NotFound from './pages/Notfound';
import FavoritesMovies from './pages/Favorites';
import UserContextProvider from './contexts/UserContext';
import RequireAuth from './contexts/RequireAuth';

function App() {

  const defaultUser = {name:"Stranger", email: "[email protected]"}

  const [moviesList, setMoviesList] = useState([])
  const [initialML, setInitialML] = useState([])
  const [userInfo, setUserInfo] = useState(defaultUser)
  // console.log(userInfo.name)
 
useEffect( () => {getMovies()}, [])

  function getMovies() {
    fetch('/movies')
    .then(response => response.json())
    .then(data => {
      const movies= data.movies
      setMoviesList(movies) 
      setInitialML(movies) 
    })
    .catch(err => console.log(err))
  
}

  return (
    <div className="App">
        <UserContextProvider user={{userInfo, setUserInfo}}>
          <Router>
            <main>
              <Routes>
                <Route path="/" element={<Home moviesList={moviesList} setMoviesList={setMoviesList} initialMovieList={initialML}/>}/>
                <Route path="/auth/*" element={<Auth />} >
                    <Route path="login" element={<Login/>} />
                    <Route path="register" element={<Register/>} />
                    <Route path="logout" element={<Register/>} />
                    {/* <Route path="*" element={<NotFound />}/> */}
                </Route>
                <Route path="movies/:movieId" element={<Movie moviesList={moviesList} setMoviesList={setMoviesList}  />} />
                <Route path="favorites" element={
                      <RequireAuth> 
                        <FavoritesMovies />
                      </RequireAuth>} />
                <Route path="*" element={<NotFound />}/>
              </Routes>
            </main>
          </Router>
          </UserContextProvider> 
     

    </div>
  );
}

export default App;

I've deploy my first app using React with Nodejs/Express/MongoDB but I'm running through a bug I couldn't find any solution, so I'm coming here to find some help.

This is the app : https://movie-app-marielyse.herokuapp.com/

As soon as the user connects, he can access the data, but if the page is reloaded, the fetch is not working anymore.

Here is the code where the fetch happens :

import './App.css';
import "./index.css"
import React, {useState, useEffect, useRef} from 'react'
import {BrowserRouter as Router, Routes, Route} from 'react-router-dom'
import Register from './components/Register';
import Login from './components/Login'
import Home from './pages/Home';
import Auth from './pages/Auth';
import Movie from './pages/Movie'
import NotFound from './pages/Notfound';
import FavoritesMovies from './pages/Favorites';
import UserContextProvider from './contexts/UserContext';
import RequireAuth from './contexts/RequireAuth';

function App() {

  const defaultUser = {name:"Stranger", email: "[email protected]"}

  const [moviesList, setMoviesList] = useState([])
  const [initialML, setInitialML] = useState([])
  const [userInfo, setUserInfo] = useState(defaultUser)
  // console.log(userInfo.name)
 
useEffect( () => {getMovies()}, [])

  function getMovies() {
    fetch('/movies')
    .then(response => response.json())
    .then(data => {
      const movies= data.movies
      setMoviesList(movies) 
      setInitialML(movies) 
    })
    .catch(err => console.log(err))
  
}

  return (
    <div className="App">
        <UserContextProvider user={{userInfo, setUserInfo}}>
          <Router>
            <main>
              <Routes>
                <Route path="/" element={<Home moviesList={moviesList} setMoviesList={setMoviesList} initialMovieList={initialML}/>}/>
                <Route path="/auth/*" element={<Auth />} >
                    <Route path="login" element={<Login/>} />
                    <Route path="register" element={<Register/>} />
                    <Route path="logout" element={<Register/>} />
                    {/* <Route path="*" element={<NotFound />}/> */}
                </Route>
                <Route path="movies/:movieId" element={<Movie moviesList={moviesList} setMoviesList={setMoviesList}  />} />
                <Route path="favorites" element={
                      <RequireAuth> 
                        <FavoritesMovies />
                      </RequireAuth>} />
                <Route path="*" element={<NotFound />}/>
              </Routes>
            </main>
          </Router>
          </UserContextProvider> 
     

    </div>
  );
}

export default App;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

黑寡妇 2025-02-02 14:36:26

通常,您的代码可以像这样修改,粗略:

  • app 中删除fetch/电影,然后将其放入 home - 这将确保在时确保使用ferseffect/fetch触发器/路由被击中。并且是保持分离和井井有条的好习惯。

应用程序组件

function App() {

  const defaultUser = {name:"Stranger", email: "[email protected]"}
  const [userInfo, setUserInfo] = useState(defaultUser)

  return (
    <div className="App">
        <UserContextProvider user={{userInfo, setUserInfo}}>
          <Router>
            <main>
              <Routes>
                <Route exact path="/" element={<Home />}/>
                <Route path="/auth/*" element={<Auth />} >
                    <Route path="login" element={<Login/>} />
                    <Route path="register" element={<Register/>} />
                    <Route path="logout" element={<Register/>} />
                    {/* <Route path="*" element={<NotFound />}/> */}
                </Route>
                <Route path="movies/:movieId" element={<Movie moviesList={moviesList} setMoviesList={setMoviesList}  />} />
                <Route path="favorites" element={
                      <RequireAuth> 
                        <FavoritesMovies />
                      </RequireAuth>} />
                <Route path="*" element={<NotFound />}/>
              </Routes>
            </main>
          </Router>
          </UserContextProvider> 
    </div>
  );
}

export default App;

home组件

function Home() {
  const [moviesList, setMoviesList] = useState([])
  const [initialML, setInitialML] = useState([])
 
  useEffect( () => {getMovies()}, []);

  function getMovies() {
    fetch('/movies')
    .then(response => response.json())
    .then(data => {
      const movies= data.movies
      setMoviesList(movies) 
      setInitialML(movies) 
    })
    .catch(err => console.log(err))
  }

  return (....)
}

,我不确定您使用的是哪个版本,但是如果不是v6,则可以检查react.router。 ://v5.reactrouter.com/web/api/switch“ rel =“ nofollow noreferrer”> https://v5.reactrouter.com/web/api/switch

In general your code can be modified like this, roughy:

  • remove fetch /movies from App and place it inside Home - this would make sure useEffect/fetch triggers when / route is hit. And is good practice to keep things separated and well organized.

App component

function App() {

  const defaultUser = {name:"Stranger", email: "[email protected]"}
  const [userInfo, setUserInfo] = useState(defaultUser)

  return (
    <div className="App">
        <UserContextProvider user={{userInfo, setUserInfo}}>
          <Router>
            <main>
              <Routes>
                <Route exact path="/" element={<Home />}/>
                <Route path="/auth/*" element={<Auth />} >
                    <Route path="login" element={<Login/>} />
                    <Route path="register" element={<Register/>} />
                    <Route path="logout" element={<Register/>} />
                    {/* <Route path="*" element={<NotFound />}/> */}
                </Route>
                <Route path="movies/:movieId" element={<Movie moviesList={moviesList} setMoviesList={setMoviesList}  />} />
                <Route path="favorites" element={
                      <RequireAuth> 
                        <FavoritesMovies />
                      </RequireAuth>} />
                <Route path="*" element={<NotFound />}/>
              </Routes>
            </main>
          </Router>
          </UserContextProvider> 
    </div>
  );
}

export default App;

Home component

function Home() {
  const [moviesList, setMoviesList] = useState([])
  const [initialML, setInitialML] = useState([])
 
  useEffect( () => {getMovies()}, []);

  function getMovies() {
    fetch('/movies')
    .then(response => response.json())
    .then(data => {
      const movies= data.movies
      setMoviesList(movies) 
      setInitialML(movies) 
    })
    .catch(err => console.log(err))
  }

  return (....)
}

And i am not sure which version you are using but if it is not v6, more on React.Router could be checked- https://v5.reactrouter.com/web/api/Switch and exact https://dev.to/danhjoo7/using-a-switch-component-in-react-router-d2k

肤浅与狂妄 2025-02-02 14:36:26
<Route path="/" element={<Home moviesList={moviesList} setMoviesList={setMoviesList} initialMovieList={initialML}/>}/>

在此行或任何地方都有 MovieList initialml 尝试执行:

<Route path="/" element={<Home moviesList={moviesList && moviesList} setMoviesList={setMoviesList} initialMovieList={initialML && initialML}/>}/>

您的提取请求是异步的,因此需要一些时间,但是在此之前已经呈现了汇编,然后才看起来很可能看起来很可能数据没有被获取。

<Route path="/" element={<Home moviesList={moviesList} setMoviesList={setMoviesList} initialMovieList={initialML}/>}/>

On this line or where ever there is moviesList and initialML try doing:

<Route path="/" element={<Home moviesList={moviesList && moviesList} setMoviesList={setMoviesList} initialMovieList={initialML && initialML}/>}/>

Your fetch request is async so it takes some time but the compenent is already rendered before that thats probably it looks data is not being fetched.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文