La biblioteca socket.io-client no es compatible con la última versión de Angular 6. Hay un error en el momento de la ejecución:
ReferenceError: global no está definido en Object ../ node_modules / socket.io-client / node_modules / socket.io-parser / is-buffer.js (is-buffer.js: 4)
Lea el comentario a continuación para saber más:
https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814
Si desea ver este error por sí mismo, agregue al servicio simple de la aplicación angular 6.0 como el siguiente:
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();
}
}
El error desaparece cuando elimina la función initSocket.
Ok, hay una solución en Angular 6 para trabajar con socket.io-client.
Agregue (ventana como cualquiera) .global = window; a polyfills.ts
De hecho, hay una serie de global
referencias en el proyecto y sus dependencias: 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 + extensión% 3A.js & type = Code & ref = advsearch & l = & l =
Sin embargo, no estoy seguro de los efectos secundarios de eliminar estas referencias.
@darrachequesne ¿Sería posible agregar estos cambios a una bifurcación del proyecto hasta que se resuelvan correctamente?
@jessycormier, ¿a qué te refieres con "una bifurcación del proyecto"?
Un primer efecto secundario, parece que eliminar el global en https://github.com/darrachequesne/has-binary/pull/4 rompe algunas aplicaciones de Electron: https://github.com/darrachequesne/has-binary/issues/ 5 ...
Hola. ¿Hay algún progreso? ¿Alguna solución? ¿Alguna solución alternativa recomendada?
@realshaft : la
Ok, hay una solución en Angular 6 para trabajar con socket.io-client.
Agregue(window as any).global = window;
apolyfills.ts
(ubicado en la carpetasrc
)
@realshaft gracias, funciona en angular6;)
hola @todos ,
Por favor, ayúdame.
así que creé un servicio para manejar mi conexión websocket y le inyecté un componente.
la conexión al socket está bien ya que obtengo a user connected
en la consola del servidor.
pero cuando intenté enviar un mensaje desde el componente no se envía nada.
aquí están mis archivos:
socketService.ts
importar {Inyectable} de '@ angular / core'; importar {Observable} de 'rxjs / Observable'; importar {Asunto} de 'rxjs / Asunto'; importar * como io desde 'socket.io-client'; @Inyectable ({ provideIn: 'raíz' }) export class SocketService { url privada = 'http: // localhost: 3000'; socket privado = io (this.url); // envía un mensaje a socket mensaje (msg) { // enviar mensaje this.socket.emit ('chat', mensaje); } chat (msg) { this.socket $ .emit ('chat', mensaje); // dejar observable } }
y el archivo de componentes
importar {Component, OnInit} desde '@ angular / core'; importar {SocketService} desde '../../socket.service'; @Componente({ selector: 'app-socket', templateUrl: './socket.component.html', styleUrls: ['./socket.component.scss'] }) export class SocketComponent implementa OnInit { constructor( socket privado: SocketService ) {} ngOnInit () { } enviar () { const msg = 'hola'; this.socket.message (msg); } }
aquí está mi conexión de servidor de socket. usé MVC
const gameModel = require ('../ modelos / juego') const userModel = require ('../ modelos / usuarios') const wsModel = require ('../ modelos / socket') const socket = require ('socket.io') module.exports = (servidor) => { const io = socket (servidor); // Controlador WebSocket io.on ('conexión', (enchufe) => { console.log ('un usuario conectado') }) // obtener el mensaje de chat io.on ('chat', (msg) => { // io.emit ('res', json.stringify (msg)) console.log (msg); }) }
gracias de antemano
aquí una forma un poco hacky de hacer que funcione:
Descargue socket.io-client desde un cdn y colóquelo en la carpeta src
con el nombre socket.io-client.js
Dentro de main.ts
agregue estas líneas:
import * as io_ from './socket.io-client.js';
window['io'] = io_;
Dentro de polyfills.ts
agregar:
(window as any).global = window;
Ahora puede usar la llamada socket.io-client
usando:
window['io']('localhost')
el mío comenzó a funcionar simplemente agregando lo siguiente
Dentro de
polyfills.ts
agregar:(window as any).global = window;
angular 6.1.0
socket.io-cliente 2.1.1
Esto continúa funcionando después de actualizar a angular 7.1.x
me ayuda, pero ¿por qué?
@realshaft gracias, funciona en angular6;)
También funcionó para mí en Angular 7.x, gracias.
(window as any).global = window;
Esto también funcionó para mí en Angular 7.
la misma solución funciona con angular 8
Dios no puedo creer que diga esto. La misma solución que proporcionó @mjarkk . Funciona en angular10! - Para mí, la razón es que el servidor 2.x no funciona con el cliente 3.x.
Después de 3 versiones, este truco todavía funciona lmao, apuesto a que funciona igual en angular 11.
Pero al ver este problema emergente nuevamente, ahora solo recomendaría usar WebSockets javascript nativos, ya que son compatibles con todos los navegadores principales, para un tutorial para comenzar: https://javascript.info/websocket.
Para futuros lectores: este problema se solucionó en [email protected]
, ya no hay ninguna referencia al objeto global
.
Confirmaciones relacionadas:
[email protected]
)[email protected]
)Además: aquí se agregó un ejemplo con Angular 11: https://github.com/socketio/socket.io/tree/master/examples/angular-todomvc
¡Gracias!
Comentario más útil
el mío comenzó a funcionar simplemente agregando lo siguiente
angular 6.1.0
socket.io-cliente 2.1.1
Esto continúa funcionando después de actualizar a angular 7.1.x