Nuxt / Vue - почему страница загружается до выполнения beforeRouteEnter?

Я новичок в Nuxt и работаю над приложением SSR, которое использует Django на бэкэнде.

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

По разным причинам я не могу сделать это из промежуточного программного обеспечения Nuxt, так как мне нужно, чтобы этот код выполнялся на стороне клиента, а не на стороне сервера, поэтому я решил использовать beforeRouteEnter. Кажется, мой код работает, но проблема в том, что он загружает страницу, а затем, примерно через 1-2 секунды, перенаправляет на другую страницу. Это немного некрасиво, так как я не хочу, чтобы пользователь видел страницу входа в систему перед перенаправлением. Я пробовал то же самое с beforeCreate, но результат был таким же

Почему так случилось? Это потому, что страница кешируется? Могу я это исправить?

Вот код:

export default {
  name: 'LoginPage',

  props: {
  },

  data(){
    return {
    }
  },

  beforeRouteEnter (to, from, next) {
    return axios({
      method: 'post',
      url: 'http://127.0.0.1:8000/checkAuth',
      data: {
      },
      withCredentials: true,
      headers: {}
    }).then(function (response) {
      if (response['data']['state'] == 'True'){
        //user is logged in, redirect
        next('/')
      } else {
        //user is not logged in, don't redirect
        next()
      }
      
    }).catch(function (error) {
      next()
    });

  }
 ...
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
14
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте написать это в этой форме

beforeRouteEnter(to, from, next) {
  next(async (vm) => {
    await axios...

    if (...) {
      next()
    } else {
      next(false) // in case the navigation needs to be blocked
    }
  })
}

Таким образом, он должен дождаться результата, прежде чем разрешить навигацию.


Если вам нужна эта проверка только на pages, вы также можете использовать asyncData для получения данных даже до перехода на следующую страницу (она будет заблокирована до тех пор, пока не будет разрешена). Остерегайтесь, потому что F5 на целевой странице не вызовет этот хук.

Большое тебе спасибо! Я пробовал это, но результат тот же. То же самое происходит с asyncData. В основном HTML-код страницы загружается, и через секунду запускается все содержимое Nuxt.

Jack022 09.04.2021 18:06

Если вы async/await вызовите свой axios, он подождет, прежде чем разрешить навигацию. Вы можете поместить setTimeout на 4 секунды в ловушку asyncData, чтобы быть уверенным, что он ожидает вызова API (просто чтобы убедиться, что вы правильно его подключили!). Если он не ждет setTimeout, где-то есть проблема.

kissu 09.04.2021 18:08

Я имею в виду, что что бы я ни попробовал, перед перенаправлением я увижу страницу входа на 1 секунду. Я имею в виду, что HTML на моей странице отображается, а затем выполняется код Nuxt. Это происходит со всем, что я пробовал, включая asyncData и другие методы.

Jack022 09.04.2021 18:11

Является ли ваша страница начальной или той, на которую вы переходите (переходя со страницы до этой, через vue-router)?

kissu 09.04.2021 18:13

Позвольте мне попытаться объяснить. Вот что происходит в моем браузере (Chrome): я обновляю страницу входа -> сразу же увижу html-страницу на странице -> примерно через одну секунду происходит перенаправление, хотя на консоли Nuxt я вижу, что код выполняется немедленно

Jack022 09.04.2021 18:14

Это происходит, когда я перехожу прямо из ввода URL, а не из навигации

Jack022 09.04.2021 18:15

Если ваш проект создан как универсальное приложение, это правда, что вы увидите статическую страницу входа до того, как начнется гидратация. Нет никакого способа обойти это, кроме как иметь статический загрузчик или что-то подобное, которое вы удалите, если он проверит Логика JS. Если вам не нужны преимущества SSR, вы также можете сделать свое приложение только SPA, что устранит эту головную боль. В противном случае рекомендуется начать разработку страницы-заполнителя до тех пор, пока не начнется гидратация. ^^

kissu 09.04.2021 18:16

Спасибо, ну я начинаю думать, что мне нужен режим SPA, а не универсальный в данном случае

Jack022 09.04.2021 18:17

Еще одна интересная вещь - это то, что вы можете указать Nuxt исключить создание определенных страниц, вы можете записать на нее свою страницу login, и она будет единственной, которая будет отображаться на стороне клиента. Остальная часть вашего приложения останется универсальной. nuxtjs.org/docs/2.x/configuration-glossary/…

kissu 09.04.2021 18:19

Спасибо. Да, действительно странно, что я пробовал это с ssr: false, но у меня все еще была эта проблема. Может мне нужно что-то еще сделать, чтобы сделать это в режиме SPA

Jack022 09.04.2021 18:25

Затем вам понадобится yarn build (target должен быть server, если я правильно помню) для производственной сборки, и он должен отлично работать с базовым yarn dev. Попробуйте отключить JS на стороне клиента, чтобы дважды проверить, действительно ли это только SPA или нет. Может пригодится: stackoverflow.com/a/63638062/8816585

kissu 09.04.2021 18:33

Другие вопросы по теме