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
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 dossiersrc
)
@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.
Pour les futurs lecteurs: ce problème a été résolu dans [email protected]
, il n'y a plus de référence à l'objet global
.
Commits associés:
[email protected]
)[email protected]
)En outre: un exemple avec Angular 11 a été ajouté ici: https://github.com/socketio/socket.io/tree/master/examples/angular-todomvc
Merci!
Commentaire le plus utile
le mien a commencé à fonctionner en ajoutant simplement ce qui suit
angulaire 6.1.0
socket.io-client 2.1.1
Cela continue de fonctionner après la mise à niveau vers angular 7.1.x