Die Bibliothek socket.io-client ist nicht mit dem neuesten Angular 6 kompatibel. Zur Ausführungszeit ist ein Fehler aufgetreten:
ReferenceError: global ist nicht definiert unter Object ../ node_modules / socket.io-client / node_modules / socket.io-parser / is-buffer.js (is-buffer.js: 4)
Bitte lesen Sie den Kommentar unten, um mehr zu erfahren:
https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814
Wenn Sie diesen Fehler selbst sehen möchten, fügen Sie der Angular 6.0 App einen einfachen Service wie den folgenden hinzu:
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();
}
}
Der Fehler verschwindet, wenn Sie die initSocket-Funktion entfernen.
Ok, es gibt eine Problemumgehung in Angular 6, um mit socket.io-client zu arbeiten.
Add (Fenster wie jedes) .global = window; zu polyfills.ts
Es gibt tatsächlich eine Reihe von global
Referenzen im Projekt und seinen Abhängigkeiten: https://github.com/search?utf8=%E2%9C%93&q=global+repo%3Asocketio%2Fengine.io-client + repo% 3Asocketio% 2Fengine.io-parser + repo% 3Asocketio% 2Fsocket.io-client + repo% 3Asocketio% 2Fsocket.io-parser + erweiterung% 3A.js & type = Code & ref = advsearch & l = & l =
Ich bin mir jedoch nicht sicher, welche Nebenwirkungen das Entfernen dieser Referenzen hat.
@darrachequesne Wäre es möglich, diese Änderungen zu einem Teil des Projekts hinzuzufügen, bis sie ordnungsgemäß behoben sind?
@jessycormier was meinst du mit "eine Abzweigung des Projekts"?
Als erster Nebeneffekt scheint das Entfernen der globalen in https://github.com/darrachequesne/has-binary/pull/4 einige Electron-Apps zu beschädigen: https://github.com/darrachequesne/has-binary/issues/ 5 ...
Hallo. Gibt es hier irgendwelche Fortschritte? Irgendeine Lösung? Eine empfohlene Problemumgehung?
@realshaft - Die obige
Ok, es gibt eine Problemumgehung in Angular 6, um mit socket.io-client zu arbeiten.
Fügen Sie(window as any).global = window;
zupolyfills.ts
(befindet sich im Ordnersrc
)
@realshaft danke, es funktioniert in angle6;)
Hallo @Jeder ,
bitte hilf mir.
Also habe ich einen Dienst für meine Websocket-Verbindung erstellt und ihm eine Komponente hinzugefügt.
Die Verbindung zum Socket ist in Ordnung, da ich die a user connected
in der Serverkonsole bekomme.
aber als ich versuchte, eine Nachricht von der Komponente zu senden, wird nichts gesendet.
Hier sind meine Dateien:
socketService.ts
{Injectable} aus '@ angle / core' importieren; {Observable} aus 'rxjs / Observable' importieren; {Subject} aus 'rxjs / Subject' importieren; * als io aus 'socket.io-client' importieren; @Injectable ({ vorausgesetztIn: 'root' }) Exportklasse SocketService { private url = 'http: // localhost: 3000'; privater Socket = io (this.url); // sende eine Nachricht an Socket Nachricht (Nachricht) { // Nachricht senden this.socket.emit ('chat', msg); }} chat (msg) { this.socket $ .emit ('chat', msg); // beobachtbar lassen }} }}
und die Komponentendatei
{Component, OnInit} aus '@ angle / core' importieren; {SocketService} aus '../../socket.service' importieren; @Komponente({ Selektor: 'App-Socket', templateUrl: './socket.component.html', styleUrls: ['./socket.component.scss'] }) Exportklasse SocketComponent implementiert OnInit { Konstrukteur( privater Socket: SocketService ) {} ngOnInit () { }} senden() { const msg = 'Hallo'; this.socket.message (msg); }} }}
Hier ist meine Socket-Server-Verbindung. Ich habe MVC verwendet
const gameModel = require ('../ models / game') const userModel = require ('../ models / users') const wsModel = require ('../ models / socket') const socket = require ('socket.io') module.exports = (server) => { const io = Socket (Server); // WebSocket-Handler io.on ('Verbindung', (Socket) => { console.log ('ein Benutzer verbunden') }) // Holen Sie sich die Chat-Nachricht io.on ('chat', (msg) => { // io.emit ('res', json.stringify (msg)) console.log (msg); }) }}
danke im Voraus
Hier ein bisschen hackiger Weg, um es zum Laufen zu bringen:
Laden Sie den socket.io-client von einer CD src
mit dem Namen socket.io-client.js
Fügen Sie innerhalb der main.ts
die folgenden Zeilen hinzu:
import * as io_ from './socket.io-client.js';
window['io'] = io_;
Innerhalb von polyfills.ts
hinzufügen:
(window as any).global = window;
Jetzt können Sie call socket.io-client
mit:
window['io']('localhost')
meins begann zu arbeiten, indem er einfach Folgendes hinzufügte
Innerhalb von
polyfills.ts
hinzufügen:(window as any).global = window;
eckig 6.1.0
socket.io-client 2.1.1
Dies funktioniert nach dem Upgrade auf Angular 7.1.x weiter
es hilft mir, aber warum?
@realshaft danke, es funktioniert in angle6;)
Es hat auch bei Angular 7.x funktioniert, danke.
(window as any).global = window;
Dies funktionierte auch bei Angular 7.
Die gleiche Lösung funktioniert mit Winkel 8
Gott kann nicht glauben, dass ich das sage. Gleiche Lösung @mjarkk zur Verfügung gestellt. Funktioniert in angle10! - Für mich ist der Grund, dass der 2.x Server nicht mit dem 3.x Client funktioniert!
Nach 3 Versionen funktioniert dieser Hack immer noch lmao, ich wette, er funktioniert genauso in Winkel 11.
Wenn dieses Problem jedoch erneut angezeigt wird, würde ich nur empfehlen, native Javascript- WebSockets zu verwenden, da diese in allen gängigen Browsern unterstützt werden, damit ein Tutorial gestartet werden kann: https://javascript.info/websocket.
Für zukünftige Leser: Dieses Problem wurde in [email protected]
behoben. Es gibt keinen Verweis mehr auf das Objekt global
.
Verwandte Commits:
[email protected]
)[email protected]
)Außerdem wurde hier ein Beispiel mit Angular 11 hinzugefügt: https://github.com/socketio/socket.io/tree/master/examples/angular-todomvc
Vielen Dank!
Hilfreichster Kommentar
meins begann zu arbeiten, indem er einfach Folgendes hinzufügte
eckig 6.1.0
socket.io-client 2.1.1
Dies funktioniert nach dem Upgrade auf Angular 7.1.x weiter