Next.js router.push() перенаправляет, но не отображает страницу

#reactjs #graphql #next.js

#reactjs #graphql #next.js

Вопрос:

Я запускаю Next.js приложение в localhost: 3000, которое изначально перенаправляет на страницу входа в систему, если там нет пользовательских данных. Изначально он перенаправляет на страницу входа, но не отображается, и я получаю эту ошибку:

 Error: Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
    in Index (at _app.js:7)
    in ApolloProvider (at _app.js:6)
    in MyApp
    in ErrorBoundary (created by ReactDevOverlay)
    in ReactDevOverlay (created by Container)
    in Container (created by AppContainer)
    in AppContainer
    in Root
  

Я не уверен, что я делаю неправильно. Я новичок в Next.js и не знаю, как с этим бороться.

Любая помощь будет оценена.

Вот мой код:

 import Layout from '../components/Layout';
import Client from '../components/Client';
import { useRouter } from 'next/router';
import { useQuery } from '@apollo/client';
import { queryGetClientsVendor } from '../graphql/queries';
import Link from 'next/link';

const Index = () => {
  const router = useRouter();

  const { data, loading, error } = useQuery(queryGetClientsVendor);
  console.log(data, loading, error);

  if (loading) return 'Loading...';

  if (!data.getClientsVendor) {
    return router.push('/login');
  }

  return (
    <div>
      <Layout>
        <h1 className='text-2xl text-gray-800 font-normal'>Index</h1>
        <Link href='/newclient'>
          <a className='bg-blue-800 py-2 px-5 mt-5 inline-block text-white rounded text-sm hover:bg-gray-800 mb-3 uppercase font-bold'>
            New Client
          </a>
        </Link>

        <table className='table-auto shadow-md mt-10 w-full w-lg'>
          <thead className='bg-gray-800'>
            <tr className='text-white'>
              <th className='w-1/5 py-2'>Name</th>
              <th className='w-1/5 py-2'>Company</th>
              <th className='w-1/5 py-2'>Email</th>
              <th className='w-1/5 py-2'>Delete</th>
              <th className='w-1/5 py-2'>Edit</th>
            </tr>
          </thead>

          <tbody className='bg-white'>
            {data.getClientsVendor.map((client) => (
              <Client key={client.id} client={client} />
            ))}
          </tbody>
        </table>
      </Layout>
    </div>
  );
};

export default Index;
  

Вы также можете проверить весь проект кода на github => https://github.com/francislagares/crm-react

Заранее спасибо.

Ответ №1:

Вы не возвращаете router.push — это не React child так.

Я предлагаю вам попробовать с:

 if (!data.getClientsVendor) {
   router.push('/login');
   return <p>Redirecting...</p>;
}

  

Спасибо.

Комментарии:

1. Я уже пробовал и перенаправляет хорошо, но когда я вхожу в систему, он снова перенаправляет на страницу входа. Мне нужно перенаправить на страницу администратора после входа в систему.

Ответ №2:

Что ж, после изучения следующих документов я, наконец, смог заставить его работать с getInititalProps:

 Index.getInitialProps = async (ctx) => {
  if (ctx amp;amp; ctx.req) {
    ctx.res.writeHead(302, { Location: '/login' });
    ctx.res.end();
  } else {
    return {};
  }
};
 
  

Спасибо.