Угловой универсальный серверный рендеринг WebSocket

Есть ли примеры Angular Universal с WebSockets?

Серверный рендеринг не знает, какой объект WebSocket находится в моем случае. И если я использую socket.io, сервер узла зависает при попытке установить соединение.

Дополнительная информация о проблеме:

Я загрузил angular-universal-starter с github: https://github.com/angular/universal-starter Что отлично работает из коробки, запустив 'npm install' и 'npm start'

Но после того, как я добавил следующий код в AppComponent

   export class AppComponent implements OnInit {
       ngOnInit() {
           let webSocket = new WebSocket("----server url----")
       }
   }

В моей серверной консоли NodeJs появилась следующая ошибка:

EXCEPTION: WebSocket is not defined
ORIGINAL STACKTRACE:
ReferenceError: WebSocket is not defined
    at AppComponent.ngOnInit (/Volumes/Development/cacadu/website/universal-starter-master2/dist
/server/index.js:41725:29)

person Marco    schedule 17.01.2017    source источник
comment
Можете ли вы показать пример кода того, что у вас есть сейчас, и опубликовать информацию об ошибках / отладке, которая может появиться?   -  person Mark Pieszak - Trilon.io    schedule 17.01.2017
comment
См. Мой комментарий ниже   -  person Marco    schedule 18.01.2017


Ответы (1)


Попробуйте вызвать только веб-сокет на клиенте, например, вы можете определить, является ли это браузер или сервер с этим импортом.

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

Затем используйте их в своем коде, это может решить проблему!

@Component({ ... })
export class AppComponent implements OnInit {

    private isBrowser: boolean = isPlatformBrowser(this.platformId);

    constructor(
       @Inject(PLATFORM_ID) private platformId: Object
    ) {
        if (isBrowser) {
            let webSocket = new WebSocket("----server url----");
        }
    }
}
person Mark Pieszak - Trilon.io    schedule 18.01.2017
comment
Спасибо, я пробовал импортировать {isBrowser, isNode} из angular2-universal / browser; Но, конечно, это неправильно ... Кажется, теперь все работает! - person Marco; 18.01.2017
comment
что, если я захочу вызвать его и на сервере? что, если я хочу использовать некоторые данные веб-сокета для рендеринга ssr? - person Ronin; 22.07.2018
comment
В этом случае вам нужно будет использовать DI, чтобы иметь реализацию узла websocket только для SSR, и убедитесь, что вы отключили его сразу после того, как сервер отобразил ваше приложение в строку, а затем повторно подключился на стороне браузера. @Ronin - person Mark Pieszak - Trilon.io; 27.07.2018
comment
Также я обновил ответ, чтобы использовать последний необходимый импорт платформы-сервера, angular2-universal давно устарел. - person Mark Pieszak - Trilon.io; 27.07.2018
comment
Отлично. Вы спасли меня после двух дней попыток решить эту проблему. Ты легенда - person Ulrich Dohou; 04.09.2018
comment
Откуда вы это знаете, и актуально ли это до сих пор? - person Christian Matthew; 09.06.2020
comment
Моя проблема - угловой универсальный сервер. Я не могу заставить его работать. - person Christian Matthew; 09.06.2020
comment
@ MarkPieszak-Trilon.io, вы можете объяснить, почему это работает, и не используете ngzone.runOutsideAngular () - person Christian Matthew; 15.06.2020