Socket.io-client: Die Bibliothek socket.io-client ist nicht mit dem neuesten Angular 6 kompatibel

Erstellt am 13. Mai 2018  ·  16Kommentare  ·  Quelle: socketio/socket.io-client

Ich will:

  • [x] einen Fehler melden - behoben, suchen Sie in den letzten beiden Zeilen nach einer Problemumgehung

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

bug

Hilfreichster Kommentar

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

Alle 16 Kommentare

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; zu polyfills.ts (befindet sich im Ordner src )

@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.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen