Socket.io-client: Библиотека socket.io-client несовместима с последней версией Angular 6

Созданный на 13 мая 2018  ·  16Комментарии  ·  Источник: socketio/socket.io-client

Я бы хотел:

  • [x] сообщить об ошибке - решено;

Библиотека socket.io-client несовместима с последней версией Angular 6. Во время выполнения произошла ошибка:

ReferenceError: global не определен в Object ../ node_modules / socket.io-client / node_modules / socket.io-parser / is-buffer.js (is-buffer.js: 4)

Пожалуйста, прочтите комментарий ниже, чтобы узнать больше:
https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814

Если вы хотите увидеть эту ошибку сами, добавьте в приложение angular 6.0 простой сервис, как показано ниже:

import { Injectable } from 'angular/core';
import * as socketIo from 'socket.io-client';

@Injectable()
export class SocketService {
    private socket;

    constructor() {}

    public initSocket(): void {
        this.socket = socketIo();
    }
}

Ошибка исчезает при удалении функции initSocket.



Хорошо, в Angular 6 есть обходной путь для работы с socket.io-client.
Добавить (окно как любое) .global = window; в polyfills.ts

Самый полезный комментарий

мой начал работать, просто добавив следующие

Внутри polyfills.ts add:

(window as any).global = window;

угловой 6.1.0
socket.io-client 2.1.1

Это продолжает работать после обновления до angular 7.1.x

Все 16 Комментарий

Действительно, в проекте и его зависимостях есть несколько ссылок на global : https://github.com/search?utf8=%E2%9C%93&q=global+repo%3Asocketio%2Fengine.io-client + репо% 3Asocketio% 2Fengine.io-parser + репо% 3Asocketio% 2Fsocket.io-client + репо% 3Asocketio% 2Fsocket.io-parser + extension% 3A.js & type = Code & ref = advsearch & l = & l =

Однако я не уверен в побочных эффектах удаления этих ссылок.

@darrachequesne Можно ли будет добавить эти изменения в форк проекта до тех пор, пока они не будут

@jessycormier, что вы подразумеваете под «форком проекта»?

Первый побочный эффект, похоже, удаление глобального в https://github.com/darrachequesne/has-binary/pull/4 нарушает работу некоторых приложений Electron: https://github.com/darrachequesne/has-binary/issues/ 5 ...

Привет. Есть ли здесь прогресс? Любое решение? Любой рекомендуемый обходной путь?

@realshaft - вышеуказанный

Хорошо, в Angular 6 есть обходной путь для работы с socket.io-client.
Добавить (window as any).global = window; в polyfills.ts (находится в папке src )

@realshaft спасибо, в angular6 работает;)

привет @Everyone ,
пожалуйста, помогите мне.
поэтому я создал сервис для обработки моего соединения с веб-сокетом и ввел ему компонент.
подключение к сокету в порядке, поскольку я получаю a user connected в консоли сервера.
но когда я пытался отправить сообщение от компонента, ничего не отправляется.
вот мои файлы:
socketService.ts

 импортировать {Injectable} из '@ angular / core';
 импортировать {Observable} из 'rxjs / Observable';
 импортировать {Тема} из 'rxjs / Subject';
 import * как io из socket.io-client;

 @Injectable ({
 providedIn: 'root'
 })
 export class SocketService {

 частный url = 'http: // localhost: 3000';
 частный сокет = io (this.url);

 // отправляем сообщение в сокет
 message (msg) {
 // отправляем сообщение
 this.socket.emit ('чат', сообщение);
 }

 chat (msg) {
 this.socket $ .emit ('чат', сообщение);

 // пусть наблюдаемый
 }
 }

и файл компонента

 импортировать {Component, OnInit} из '@ angular / core';
 import {SocketService} из '../../socket.service';

 @Составная часть({
 селектор: 'app-socket',
 templateUrl: './socket.component.html',
 styleUrls: ['./socket.component.scss']
 })
 класс экспорта SocketComponent реализует OnInit {

 конструктор(
 частный сокет: SocketService
 ) {}

 ngOnInit () {
 }

 Отправить() {
 const msg = 'привет';
 this.socket.message (сообщение);
 }

 }

вот мое подключение к серверу сокетов. я использовал MVC

 const gameModel = require ('../ модели / игра')
 const userModel = require ('../ модели / пользователи')
 const wsModel = require ('../ модели / сокет')
 const socket = require ('socket.io')

 module.exports = (сервер) => {

 const io = сокет (сервер);

 // Обработчик WebSocket
 io.on ('соединение', (сокет) => {
 console.log ('пользователь подключен')
 })

 // получаем сообщение чата
 io.on ('чат', (msg) => {
 // io.emit ('res', json.stringify (msg))
 console.log (сообщение);
 })

 }

заранее спасибо

вот немного хакерский способ заставить его работать:
Загрузите socket.io-client с компакт-диска и поместите его в папку src с именем socket.io-client.js

Внутри main.ts добавьте следующие строки:

import * as io_ from './socket.io-client.js';
window['io'] = io_;

Внутри polyfills.ts добавить:

(window as any).global = window;

Теперь вы можете использовать call socket.io-client используя:

window['io']('localhost')

мой начал работать, просто добавив следующие

Внутри polyfills.ts add:

(window as any).global = window;

угловой 6.1.0
socket.io-client 2.1.1

Это продолжает работать после обновления до angular 7.1.x

мне это поможет, но почему?

@realshaft спасибо, в angular6 работает;)

У меня это сработало и на Angular 7.x, спасибо.

(window as any).global = window;
Это сработало и для меня на Angular 7.

такое же решение работает с угловым 8

Бог не могу поверить, что я это говорю. Такое же решение предоставлено @mjarkk . Работает в angular10! - Для меня причина в том, что сервер 2.x не работает с клиентом 3.x!

После 3 версий этот хак все еще работает lmao, держу пари, что он работает так же в angular 11.
Но, снова увидев всплывающее окно с этой проблемой, я бы просто посоветовал использовать собственные веб- сокеты на javascript, поскольку они поддерживаются во всех основных браузерах, для начала работы с учебником: https://javascript.info/websocket.

Для будущих читателей: эта проблема исправлена ​​в [email protected] , больше нет ссылки на объект global .

Связанные коммиты:

Кроме того: здесь был добавлен пример с Angular 11: https://github.com/socketio/socket.io/tree/master/examples/angular-todomvc

Благодаря!

Была ли эта страница полезной?
0 / 5 - 0 рейтинги