Angular 17 WebSocket не определен

У меня есть приложение SpringBoot, в котором я настроил WebSocket, к которому могу подключиться с помощью Postman. У меня это есть на ws://localhost:8050. Только с одним пространством имен «сокет».

Я попытался настроить собственный угловой веб-сокет и простое подключение, но столкнулся с внутренней ошибкой сервера.

[Angular 17 WebSocket не определен]

Я попытался создать соединение WebSocket следующим образом.

    this.socket = new WebSocket("ws://localhost:8050/socket")

Я не импортирую для этого конструктора какую-либо библиотеку типа «ws», это просто собственная библиотека.

Я получаю эту ошибку.

[vite] Internal server error: WebSocket is not defined

Я ожидаю, что смогу подключиться к серверу.

вы используете SSR в своем угловом приложении?

Andrei 09.03.2024 14:54

Специально я его не настраивал. Но я вижу, что после создания проекта добавлено несколько зависимостей. Например. У меня это есть в моем server.ts. импортировать {CommonEngine} из '@angular/ssr'; Но в моем angular.json у меня есть это: "development": { ... "ssr": false }

razvanmoga 09.03.2024 15:11
Тестирование функциональных 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
0
2
893
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Когда вы работаете с SSR. Вам необходимо запретить инструментам рендеринга или сборки на стороне сервера выполнять код WebSocket.

Я бы предложил проверить, доступен ли объект окна перед инициализацией WebSocket.

if (typeof window !== 'undefined') {
    this.socket = new WebSocket("ws://localhost:8050/socket");
}

Это гарантирует, что WebSocket будет создан только в среде браузера.

Или вы можете работать с идентификатором платформы и isPlatformBrowser. Это лучший пример для Angular, в отличие от первого, который больше похож на JS.

import { Component, OnInit, Inject, PLATFORM_ID } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';

@Component({
  // Your html, scss etc...
})
export class MyComponent implements OnInit {

    private isBrowser: boolean;

    constructor(@Inject(PLATFORM_ID) private platformId: Object) {
        this.isBrowser = isPlatformBrowser(this.platformId);
    }

    ngOnInit() {
        if (this.isBrowser) {
            // Connect to WebSockets here
        } else {
            // Work without websockets or do nothing
        }
    }
}

При таком подходе ваше приложение Angular должно правильно различать серверную среду и среду браузера и пытаться использовать WebSockets только в браузере.

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