В Nextjs, как извлечь то, что находится в строке местоположения?

#authentication #next.js #strapi #google-login

Вопрос:

Я следую этому руководству, чтобы узнать, как реализовать вход с помощью кнопки Google (вместе с помощью Strapi. Руководство отлично работает с Reactjs.

Проблема возникает, когда я пытаюсь сделать то же самое с Nextjs с этой частью кода:

 import React, { useState, useEffect } from 'react'
import { useLocation } from 'react-router-dom'
import axios from 'axios'

function GoogleAuthCallback() {
  const [auth, setAuth] = useState()
  const location = useLocation()
  useEffect(() => {
    if (!location) {
      return
    }
    const { search } = location
    axios({
      method: 'GET',
      url: `http://localhost:1337/auth/google/callback?${search}`,
    })
      .then((res) => res.data)
      .then(setAuth)
  }, [location])

  return (
    <div>
      {auth amp;amp; (
        <>
          <div>Jwt: {auth.jwt}</div>
          <div>User Id: {auth.user.id}</div>
          <div>Provider: {auth.user.provider}</div>
        </>
      )}
    </div>
  )
}

export default GoogleAuthCallback
 

Я получаю следующую ошибку:
Ошибка типа: Не удается прочитать свойство quot;местоположениеquot; неопределенного

**Вопрос: есть ли способ извлечь то, что находится в строке местоположения в Nextjs, потому useLocation() что не работает.

Спасибо!

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

1.nextjs.org/docs/migrating/from-react-router, nextjs.org/docs/api-reference/next/router

2. Next.js имеет свой собственный встроенный маршрутизатор , вы должны использовать его вместо react-router-dom .

Ответ №1:

Я предполагаю , что useLocation() попытаюсь получить доступ window.location , который не определен в SSR. Вы должны динамически импортировать свой компонент с отключенным SSR : например, на своей странице :

 import dynamic from 'next/dynamic'

const DynamicComponentWithNoSSR = dynamic(
  () => import('../components/GoogleAuthCallback'), // <- path of your component
  { ssr: false } 
) 
 

Пожалуйста, обратите внимание, что вы также можете использовать значение по умолчанию next.js маршрутизатор :

 import { useRouter } from 'next/router'
function GoogleAuthCallback() {
  const [auth, setAuth] = useState()
   const router = useRouter()
   const location = router.pathname // or router.asPath
  ....
}
 

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

1. В итоге я воспользовался next.js маршрутизатор. Наконец-то эта штука заработала. Огромное спасибо!