8

我正在尝试使用 Next.js 路由器来重定向未经授权的用户访问包装在AdminLayout组件内的某些页面,但是我收到了这个错误。

错误:未找到路由器实例。您应该只在应用程序的客户端内使用“next/router”。

未找到路由器实例

// Other imports
import Router from "next/router";

class AdminLayout extends React.Component {
  render() {
    const { currentUser } = this.props;

    if (currentUser === undefined) {
      console.log(currentUser);
      return null;
    }

    if (currentUser == null) {
      console.log(currentUser);
      //this is how I tried to redirect
      Router.replace("/admin/login");
    }
    return (
      // Other irrelevant code
    );
  }
}

const mapStateToProps = (state) => ({
  currentUser: state.user.currentUser,
});

export default connect(mapStateToProps)(AdminLayout);

有任何解决这个问题的方法吗?

4

1 回答 1

5

render方法也在服务器中执行,因此您会收到异常。

通常在方法中添加副作用(例如重定向)是一种不好做法render

你应该把它放在componentDidMount只在客户端运行的里面。

// Other imports
import Router from "next/router";

class AdminLayout extends React.Component {
  componentDidMount() {
    const {currentUser} = this.props;

    if (currentUser === undefined) {
      console.log(currentUser);
      return null;
    }

    if (currentUser == null) {
      console.log(currentUser);
      //this is how I tried to redirect
      Router.replace('/admin/login');
    }
  }
  render() {
    const {currentUser} = this.props;

    if (currentUser === undefined) {
      console.log(currentUser);
      return null;
    }
    return (
      // Other irrelevant code
    );
  }
}

const mapStateToProps = (state) => ({
  currentUser: state.user.currentUser,
});

export default connect(mapStateToProps)(AdminLayout);

如果要在服务器端重定向,则需要使用getInitialProps/在服务器getServerProps上运行,这些方法在服务器端获取服务器& ,使您能够从服务器重定向。requestresponse

class AdminLayout extends React.Component {
   static getInitialProps ({ res }) {
      if(someCondition) {
        res.redirect('/your-path');
      }
   }
   ...
}
于 2020-05-30T19:53:24.830 回答