Node.js 如果用户未登录,请不要试图让用户做出反应

Node.js 如果用户未登录,请不要试图让用户做出反应,node.js,reactjs,express,Node.js,Reactjs,Express,所以,这似乎是一个非常简单的问题。我和Stackoverflow进行了研究,发现有人也有同样的问题。我找不到 我正在使用React,以及NodeJS后端。使用redux,我想确保在每次加载页面时都会检查用户是否登录。我正在这样做: `useEffect(() => { store.dispatch(loadUser()); }, []);` Redux中的加载用户是: export const loadUser = () => async (dispatch) =>

所以,这似乎是一个非常简单的问题。我和Stackoverflow进行了研究,发现有人也有同样的问题。我找不到

我正在使用
React
,以及
NodeJS
后端。使用redux,我想确保在每次加载页面时都会检查用户是否登录。我正在这样做:

`useEffect(() => {
    store.dispatch(loadUser());
  }, []);`
Redux中的加载用户是:

export const loadUser = () => async (dispatch) => {
  try {
    const res = await axios.get('/auth/me');
    dispatch({
      type: USER_LOADED,
      payload: res.data,
    });
  } catch (error) {
    dispatch({
      type: AUTH_ERROR,
    });
  }
};
因此,每次应用程序加载时,它都会将用户加载到状态

但是,当用户未登录时,我会在控制台中收到一条消息:

我知道为什么会出现错误,Nodejs中的路由是受保护的


显然,我不希望用户在部署页面时看到这一点。如何正确处理此错误?

一种简单的方法是使用本地存储api。因此,当有人登录时,您应该生成某种身份验证令牌并将其保存在本地存储中:

localStorage.setItem("token",TOKEN_VALUE)
然后在您的react应用程序中,检查此值是否存在或未使用:

localStorage.getItem("token")
如果存在,则用户仍在登录,否则不存在


这也将实现出色的用户体验,因为他们不需要每次登录,也不会注销,除非他们愿意。

一个简单的方法是使用本地存储api。因此,当有人登录时,您应该生成某种身份验证令牌并将其保存在本地存储中:

localStorage.setItem("token",TOKEN_VALUE)
然后在您的react应用程序中,检查此值是否存在或未使用:

localStorage.getItem("token")
如果存在,则用户仍在登录,否则不存在


这也将实现出色的用户体验,因为他们不需要每次登录,除非他们愿意,否则不会注销。有两种可能的情况需要考虑:

  • 用户在未经身份验证的情况下直接导航到受保护的url。在这种情况下,您的后端知道,当您的react应用程序呈现该路由的内容时,它将尝试发出的api请求将失败。相反,它应该将(
    302 Found
    )重定向到登录路径(这将让您的react应用程序呈现登录表单,而不是他请求的原始页面),在该路径中,不会发出需要验证的api请求

  • 用户在未经身份验证的情况下访问api端点。在这种情况下,您的后端应该响应
    401 Unauthorized
    。您的react应用程序应捕获该信息并呈现登录表单

  • 您应该始终假设用户可能在任何时候执行未经授权的请求,并优雅地处理该请求

    因此,您需要处理这两种情况:

  • 为你的应用服务的两条路线。一个是只为你的应用服务的登录路径。另一个也只是为应用程序提供服务,但前提是用户经过身份验证。否则,它应该重定向到登录路径。我假设您的react应用程序仅在首次装载到登录路由上时呈现登录表单,在该路径上不发生需要身份验证的api请求

  • react应用程序中的一个处理程序,在API请求因
    401
    失败时重新定向/呈现您的登录表单


  • 有两种可能的情况需要考虑:

  • 用户在未经身份验证的情况下直接导航到受保护的url。在这种情况下,您的后端知道,当您的react应用程序呈现该路由的内容时,它将尝试发出的api请求将失败。相反,它应该将(
    302 Found
    )重定向到登录路径(这将让您的react应用程序呈现登录表单,而不是他请求的原始页面),在该路径中,不会发出需要验证的api请求

  • 用户在未经身份验证的情况下访问api端点。在这种情况下,您的后端应该响应
    401 Unauthorized
    。您的react应用程序应捕获该信息并呈现登录表单

  • 您应该始终假设用户可能在任何时候执行未经授权的请求,并优雅地处理该请求

    因此,您需要处理这两种情况:

  • 为你的应用服务的两条路线。一个是只为你的应用服务的登录路径。另一个也只是为应用程序提供服务,但前提是用户经过身份验证。否则,它应该重定向到登录路径。我假设您的react应用程序仅在首次装载到登录路由上时呈现登录表单,在该路径上不发生需要身份验证的api请求

  • react应用程序中的一个处理程序,在API请求因
    401
    失败时重新定向/呈现您的登录表单


  • 用户在哪里看到错误?理解。我建议您在应用程序的顶部放置一个名为check auth的函数,并将其保留在此redux上。如果用户未登录,则无法运行loadUser等功能。由于这个错误消息来自浏览器,我想没有办法阻止它。绝对。您甚至可以在开始时将加载状态保持在某个状态,并在检查后将其拉回到完成状态。同时,您可以显示加载微调器。如果用户请求受保护的路由而未登录到后端,则可以重定向到登录路由。那么在您的登录组件中,不要执行此提取。@ShaunStone为什么这是一个问题?您的后端将有两条路由。一个是受保护的,为你的应用服务;另一个是不受保护的登录路径,也为你的应用服务。不同之处在于,如果用户未经身份验证,第一个路由将重定向到登录路由。当然,如果路径是登录路径,那么应用程序应该呈现登录表单。用户在哪里看到错误?理解。我建议您在应用程序的顶部放置一个名为check auth的函数,并将其保留在此redux上。如果用户未登录,则无法运行loadUser等功能。由于这个错误消息来自浏览器,我想没有办法阻止它。绝对。您甚至可以在开始时将加载状态保持在某个状态,并在检查后将其拉回到完成状态。与此同时,你可以