Socket.io-client: Library socket.io-client no es compatible con el último Angular 6

Creado en 13 may. 2018  ·  16Comentarios  ·  Fuente: socketio/socket.io-client

Quiero:

  • [x] informar un error - resuelto, busque en las últimas dos líneas una solución

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

bug

Comentario más útil

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

Todos 16 comentarios

@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; a polyfills.ts (ubicado en la carpeta src )

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

¿Fue útil esta página
0 / 5 - 0 calificaciones