Как получить доступ к маршрутизатору NextJS в компоненте класса

#reactjs #next.js

Вопрос:

У меня есть следующий пример в NextJS.

Я хочу получить доступ к маршрутизатору NextJS через withRouter специальные компоненты класса, как показано ниже.

 import UserManager from "../managers/user_manager";
import LogInPage from "../pages/auth/login";
import React from "react";
import { withRouter } from 'next/router'

export default function EnsureAuthenticated(OriginalComponent) {
    class AuthHOC extends React.Component {
        constructor(props) {
            super(props);
        }
        componentDidMount() {
            this.loggedInUser = UserManager.getLoggedInUser();
        }
        render() {
            if (!this.loggedInUser) {
                this.props.router.push(LogInPage.routePath);
            }
            return <OriginalComponent />
        }
    }
    return withRouter(AuthHOC);
}
 

Но это ошибка, которую я продолжаю получать:

 Server Error
Error: No router instance found. you should only use "next/router" inside the client side of your app. https://nextjs.org/docs/messages/no-router-instance
 

Что я могу сделать по-другому, чтобы решить эту проблему?
Спасибо.

Ответ №1:

NextJS использует SSR, поэтому во время предварительного рендеринга (SSR или SSG) вы пытались получить доступ к методу маршрутизатора push (this.props.router.push(LoginPage.routePath)), который не поддерживается.

вы должны использовать следующий код в componentDidMount методе

 if (!this.loggedInUser) {
      this.props.router.push(LogInPage.routePath);
}
 

как показано ниже

   componentDidMount() {
            this.loggedInUser = UserManager.getLoggedInUser();

            if (!this.loggedInUser) {
                    this.props.router.push(LogInPage.routePath);
            }
        }