Socket.io-client: La bibliothèque socket.io-client n'est pas compatible avec le dernier Angular 6

Créé le 13 mai 2018  ·  16Commentaires  ·  Source: socketio/socket.io-client

Je veux:

  • [x] signaler un bogue - résolu, regardez les deux dernières lignes pour une solution de contournement

La bibliothèque socket.io-client n'est pas compatible avec le dernier Angular 6. Il y a une erreur au moment de l'exécution:

ReferenceError: global n'est pas défini dans Object ../ node_modules / socket.io-client / node_modules / socket.io-parser / is-buffer.js (is-buffer.js: 4)

Veuillez lire le commentaire ci-dessous pour en savoir plus:
https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814

Si vous voulez voir cette erreur par vous-même, ajoutez au service simple de l'application angular 6.0 comme celui-ci ci-dessous:

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();
    }
}

L'erreur disparaît lorsque vous supprimez la fonction initSocket.



Ok, il existe une solution de contournement dans Angular 6 pour travailler avec socket.io-client.
Ajouter (fenêtre comme n'importe quel) .global = window; à polyfills.ts

bug

Commentaire le plus utile

le mien a commencé à fonctionner en ajoutant simplement ce qui suit

À l'intérieur polyfills.ts ajouter:

(window as any).global = window;

angulaire 6.1.0
socket.io-client 2.1.1

Cela continue de fonctionner après la mise à niveau vers angular 7.1.x

Tous les 16 commentaires

Il existe en effet un certain nombre de global références dans le projet et ses dépendances: 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 + extension% 3A.js & type = Code & ref = advsearch & l = & l =

Je ne suis pas sûr des effets secondaires de la suppression de ces références.

@darrachequesne Serait-il possible d'ajouter ces changements à un fork du projet jusqu'à ce qu'ils soient correctement résolus?

@jessycormier qu'entendez-vous par "un fork du projet"?

Un premier effet secondaire, il semble que la suppression du global dans https://github.com/darrachequesne/has-binary/pull/4 casse certaines applications Electron: https://github.com/darrachequesne/has-binary/issues/ 5 ...

Salut. Y a-t-il des progrès? Toute solution? Une solution de contournement recommandée?

@realshaft - la

Ok, il existe une solution de contournement dans Angular 6 pour travailler avec socket.io-client.
Ajouter (window as any).global = window; à polyfills.ts (situé dans le dossier src )

@realshaft merci, ça marche en angular6;)

bonjour @Tout le monde ,
Sil te plait aide moi.
j'ai donc créé un service pour gérer ma connexion websocket et lui ai injecté un composant.
la connexion à la socket est correcte car j'obtiens le a user connected dans la console du serveur.
mais quand j'ai essayé d'envoyer un message à partir du composant, rien n'est envoyé.
voici mes fichiers:
socketService.ts

 import {Injectable} de '@ angular / core';
 import {Observable} de 'rxjs / Observable';
 import {Subject} de 'rxjs / Subject';
 importer * comme io depuis 'socket.io-client';

 @Injectable ({
 providedIn: 'racine'
 })
 classe d'exportation SocketService {

 url privée = 'http: // localhost: 3000';
 socket privé = io (this.url);

 // envoyer un message à socket
 message (msg) {
 // envoyer un msg
 this.socket.emit ('chat', msg);
 }

 chat (msg) {
 this.socket $ .emit ('chat', msg);

 // laisse observable
 }
 }

et le fichier du composant

 import {Component, OnInit} depuis '@ angular / core';
 import {SocketService} de '../../socket.service';

 @Composant({
 sélecteur: 'app-socket',
 templateUrl: './socket.component.html',
 styleUrls: ['./socket.component.scss']
 })
 la classe d'exportation SocketComponent implémente OnInit {

 constructeur(
 socket privé: SocketService
 ) {}

 ngOnInit () {
 }

 envoyer() {
 const msg = 'bonjour';
 this.socket.message (msg);
 }

 }

voici ma connexion au serveur socket. j'ai utilisé MVC

 const gameModel = require ('../ models / game')
 const userModel = require ('../ models / users')
 const wsModel = require ('../ models / socket')
 const socket = require ('socket.io')

 module.exports = (serveur) => {

 const io = socket (serveur);

 // Gestionnaire WebSocket
 io.on ('connexion', (socket) => {
 console.log ('un utilisateur connecté')
 })

 // récupère le message de chat
 io.on ('chat', (msg) => {
 // io.emit ('res', json.stringify (msg))
 console.log (msg);
 })

 }

Merci d'avance

voici un moyen un peu piraté de le faire fonctionner:
Téléchargez socket.io-client depuis un cdn et placez-le dans le dossier src avec le nom socket.io-client.js

À l'intérieur du main.ts ajoutez ces lignes:

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

À l'intérieur polyfills.ts ajouter:

(window as any).global = window;

Vous pouvez maintenant utiliser l'appel socket.io-client utilisant:

window['io']('localhost')

le mien a commencé à fonctionner en ajoutant simplement ce qui suit

À l'intérieur polyfills.ts ajouter:

(window as any).global = window;

angulaire 6.1.0
socket.io-client 2.1.1

Cela continue de fonctionner après la mise à niveau vers angular 7.1.x

ça m'aide, mais pourquoi?

@realshaft merci, ça marche en angular6;)

Cela a fonctionné pour moi sur Angular 7.x également, merci.

(window as any).global = window;
Cela a également fonctionné pour moi sur Angular 7.

la même solution fonctionne avec angulaire 8

Dieu ne peut pas croire que je dis cela. Même solution @mjarkk fournie. Fonctionne en angular10! - Pour moi, la raison est que le serveur 2.x ne fonctionne pas avec le client 3.x!

Après 3 versions, ce hack fonctionne toujours lmao, je parie que cela fonctionne de la même manière dans angular 11.
Mais en voyant à nouveau ce problème, je conseillerais simplement d'utiliser des WebSockets javascript natifs, car ils sont pris en charge dans tous les principaux navigateurs, pour un tutoriel pour commencer: https://javascript.info/websocket.

Cette page vous a été utile?
0 / 5 - 0 notes