Reactjs 在网络环境中接收到401错误时重新定向到另一页

Reactjs 在网络环境中接收到401错误时重新定向到另一页,reactjs,react-router,relayjs,relaymodern,Reactjs,React Router,Relayjs,Relaymodern,我在我的ReactJS RelayJS网络环境中使用JWT身份验证。服务器和客户端中的所有令牌检索和处理都很好。我使用react路由器v4进行路由 我的问题是当我从服务器(状态代码401)收到未经授权的消息时。如果用户在令牌过期后指向应用程序页面,就会发生这种情况,即,我需要做的是重定向到登录页面。这是我希望能够拥有的代码: import { Environment, Network, RecordSource, Store } from 'relay-runtime'; const SERV

我在我的ReactJS RelayJS网络环境中使用JWT身份验证。服务器和客户端中的所有令牌检索和处理都很好。我使用react路由器v4进行路由

我的问题是当我从服务器(状态代码401)收到
未经授权的
消息时。如果用户在令牌过期后指向应用程序页面,就会发生这种情况,即,我需要做的是重定向到登录页面。这是我希望能够拥有的代码:

import { Environment, Network, RecordSource, Store } from 'relay-runtime';

const SERVER = 'http://localhost:3000/graphql';

const source = new RecordSource();
const store = new Store(source);

function fetchQuery(operation, variables, cacheConfig, uploadables) {
  const token = localStorage.getItem('jwtToken');

  return fetch(SERVER, {
    method: 'POST',
    headers: {
      Authorization: 'Bearer ' + token,
      Accept: 'application/json',
      'Content-type': 'application/json'
    },
    body: JSON.stringify({
      query: operation.text, // GraphQL text from input
      variables
    })
  })
    .then(response => {
      // If not authorized, then move to default route
      if (response.status === 401)
          this.props.history.push('/login') <<=== THIS IS NOT POSSIBLE AS THERE IS NO this.history.push CONTEXT AT THIS POINT
      else return response.json();
    })
    .catch(error => {
      throw new Error(
        '(environment): Error while fetching server data. Error: ' + error
      );
    });
}

const network = Network.create(fetchQuery);

const handlerProvider = null;

const environment = new Environment({
  handlerProvider, // Can omit.
  network,
  store
});

export default environment;
但我在浏览器控制台上看到了错误,代码中无法正确处理


如果收到401错误,我只想重定向到登录页面,但我找不到正确的方法。

我使用的不是中继,而是渲染道具。我也经历过类似的问题。我可以用window对象解决它

 if (response.statusText === "Unauthorized") {
     window.location = `${window.location.protocol}//${window.location.host}/login`;
 } else {
   return response.json();
 }

您可以使用
useEnvironment
custom hook

export const useEnvironment=()=>{
const history=useHistory();//{
返回fetch(“…/graphql”,{…})
。然后(响应=>{
//...
//history.push('/login');
//...
})
.捕获(…);
};
回归新环境({
网络:network.create(fetchQuery),
存储:新存储(新记录源())
});
};
// ... 代码的后面部分
const-environment=useEnvironment();
或者,如果使用类组件,则可以创建HOC或render prop组件


顺便说一句:通过这种方式,您还可以避免使用
localStorage
,这会降低性能。

您找到了解决此问题的方法吗?有任何更新吗?
 if (response.statusText === "Unauthorized") {
     window.location = `${window.location.protocol}//${window.location.host}/login`;
 } else {
   return response.json();
 }