Как использовать localStorage в Angular 18 HttpInterceptorFn?

Я новичок в Angular и пытаюсь получить токены доступа и обновления из localStorage в http-перехватчике, но получаю следующую ошибку: Page /admin did not render in 30 seconds.

auth.interceptor.ts:

import { HttpInterceptorFn } from '@angular/common/http';

export const authInterceptor: HttpInterceptorFn = (req, next) => {
  const accessToken = localStorage.getItem('access');
  const refreshToken = localStorage.getItem('refresh');

  return next(req);
};

профиль.компонент.ц:

import { Component, OnInit } from '@angular/core';
import { UserService } from '../../services/user.service';
import { ActivatedRoute } from '@angular/router';
import { Title } from '@angular/platform-browser';
import { User } from '../../models/user';

@Component({
  selector: 'app-profile',
  standalone: true,
  imports: [],
  templateUrl: './profile.component.html',
  styleUrl: './profile.component.scss'
})
export class ProfileComponent implements OnInit {
  user: User | null = null;
  isFailed = false;

  constructor(
    private userService: UserService,
    private route: ActivatedRoute,
    private titleService: Title) { }

  ngOnInit(): void {
    this.route.paramMap.subscribe((paramMap) => {
      const username = String(paramMap.get('username'));

      this.userService.getUser(username).subscribe({
        next: (user) => {
          this.isFailed = false;
          this.user = user;
          this.titleService.setTitle(`${this.user.display_name || this.user.username} profile`);
        },
        error: () => {
          this.isFailed = true;
        }
      });
    });
  }
}

Если я удалю функции localStorage.getItem(), ошибка исчезнет.

Вы не можете использовать localStorage, если используете предварительный рендеринг.

Matthieu Riegler 05.06.2024 17:19

@MatthieuRiegler Значит, я не могу получить токены из localStorage в перехватчике?

Kirill 05.06.2024 17:22
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
1
2
157
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать localstorage внутри сети, как показано ниже. После следующего хука рендеринга ваш код будет выполнен после его отображения в браузере.

afterNextRender(() => {
  localStorage.setItem('my-key', 'My value');
});

Если вы хотите использовать на стороне сервера, вам необходимо добавить полифилы, выполнив следующие шаги.

npm i localstorage-polyfill --save

Добавьте эти две строки в файл server.ts.

import 'localstorage-polyfill'

global['localStorage'] = localStorage

Затем вы можете использовать localstorage и внутри сервера.

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

Вероятно, вам не нужен предварительный рендеринг.

отключите его, удалив prerender: true со своего angular.json.

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