Библиотека 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
Действительно, в проекте и его зависимостях есть несколько ссылок на 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
.
Связанные коммиты:
[email protected]
)[email protected]
)Кроме того: здесь был добавлен пример с Angular 11: https://github.com/socketio/socket.io/tree/master/examples/angular-todomvc
Благодаря!
Самый полезный комментарий
мой начал работать, просто добавив следующие
угловой 6.1.0
socket.io-client 2.1.1
Это продолжает работать после обновления до angular 7.1.x