Socket.io-client: [error] global no está definido

Creado en 24 oct. 2017  ·  49Comentarios  ·  Fuente: socketio/socket.io-client

Nota : para preguntas de soporte, utilice uno de estos canales: stackoverflow o slack

Tú quieres:

- [x] report a *bug*
- [ ] request a *feature*

Comportamiento actual

socket.io-client no funciona con @angular/ [email protected] debido a una dependencia en la variable global de node.js
(parece provenir de [email protected] , pero no puedo encontrar quién mantiene esas versiones)

Pasos para reproducir (si el comportamiento actual es un error)

ver https://github.com/angular/angular-cli/issues/8160

Comportamiento esperado

Configuración

  • sistema operativo:
  • navegador:
  • versión socket.io: 2.0.4

Comentario más útil

Según https://github.com/angular/angular-cli/issues/8160#issuecomment -386153833:

agregar el siguiente polyfills.ts debería funcionar en Angular@6 :

// Add global to window, assigning the value of window itself.
(window as any).global = window;

En cualquier caso, este problema no debe resolverse en mi opinión, socket.io-client debe eliminar la dependencia implícita en global , o documentar que se necesita un polyfill (por cualquiera que use las fuentes preempaquetadas, no solo usuarios angulares)

(Por cierto, ¿dónde están las fuentes de los últimos [email protected] ? Tal vez podría ayudar)

Todos 49 comentarios

También enfrenta este problema actualmente

Dado que https://github.com/angular/angular-cli/issues/8160 ahora está resuelto, ¿podemos cerrar este problema? ¡Gracias!

No lo creo, porque en angular/cli> 6 eliminaron permanentemente global.
¿Puedes por favor empezar a buscarlo de nuevo? https://github.com/angular/angular-cli/issues/9827

BR,
Kevin

Una solución alternativa hasta que Angular CLI lo arregle o haga posible anular el comando de nodo, luego puede agregar el archivo delgado socket.io-client en la sección de rutas de tsconfig.app.json

"paths": {
      ....
      "socket.io-client": ["../node_modules/socket.io-client/dist/socket.io.slim.js"]
}

Incluso si funciona actualmente, según https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814, esto será un problema en Angular@6 :

"[Esto] generalmente crea una situación en la que el código del navegador que no debería funcionar en absoluto funciona solo cuando se integra con herramientas muy específicas. Esta no es una buena situación".

Confirmo que está roto en Angular 6 RC5. ¿Alguien sabe una solución?

@ngervasi lo hemos hecho haciendo lo que comenté aquí: https://github.com/socketio/socket.io-client/issues/1166#issuecomment -379225639

Lo intenté:

{ "extends": "../tsconfig.json", "compilerOptions": { "outDir": "../out-tsc/app", "module": "es2015", "baseUrl": "", "types": [] }, "exclude": [ "test.ts", "**/*.spec.ts" ], "paths": { "socket.io-client": ["../node_modules/socket.io-client/dist/socket.io.slim.js"] } }

pero no funciona en Angular 6RC5, sigo recibiendo el error:

is-buffer.js:4 Uncaught ReferenceError: global is not defined at Object../node_modules/socket.io-client/node_modules/socket.io-parser/is-buffer.js (is-buffer.js:4) at __webpack_require__ (bootstrap:74) at Object../node_modules/socket.io-client/node_modules/socket.io-parser/binary.js (binary.js:8) at __webpack_require__ (bootstrap:74) at Object../node_modules/socket.io-client/node_modules/socket.io-parser/index.js (index.js:8) at __webpack_require__ (bootstrap:74) at Object../node_modules/socket.io-client/lib/index.js (index.js:7) at __webpack_require__ (bootstrap:74) at Object../src/app/_services/websocket.service.ts (log.service.ts:5) at __webpack_require__ (bootstrap:74)

Según https://github.com/angular/angular-cli/issues/8160#issuecomment -386153833:

agregar el siguiente polyfills.ts debería funcionar en Angular@6 :

// Add global to window, assigning the value of window itself.
(window as any).global = window;

En cualquier caso, este problema no debe resolverse en mi opinión, socket.io-client debe eliminar la dependencia implícita en global , o documentar que se necesita un polyfill (por cualquiera que use las fuentes preempaquetadas, no solo usuarios angulares)

(Por cierto, ¿dónde están las fuentes de los últimos [email protected] ? Tal vez podría ayudar)

¿Cuál es la mejor solución? https://github.com/socketio/socket.io-client/issues/1166#issuecomment -379225639 (agregando rutas en tsconfig) o https://github.com/socketio/socket.io-client/issues/1166 #issuecomment -386195105 (asignando a global)?

Ambas opciones me funcionaron en el proyecto Angular v6 generado con Angular CLI.

@amitport las fuentes del paquete has-binary2 están aquí: https://github.com/darrachequesne/has-binary

Aunque me temo que no es la única ocurrencia.

@darrenmothersele no creo que haya exactamente uno "mejor". Agregar 'global' puede tener efectos secundarios para otras bibliotecas, mientras que agregar el archivo 'delgado' puede tener un efecto negativo en el tamaño del paquete (no necesariamente)

@darrachequesne agregó un PR https://github.com/darrachequesne/has-binary/pull/4 (es un comienzo :))

Probé ambas soluciones y con un proyecto angular 6.0.0 actual y ninguna funciona. Agregué la entrada de rutas a tsconfig.app.json y la entrada a polyfills.ts pero sigo recibiendo el mismo error en Chrome.

lo mismo aquí, la solución tsconfig no funciona en ng cli 6

// Agregar global a la ventana, asignando el valor de la ventana misma.
(ventana como cualquiera). global = ventana;

está trabajando para mí
Gracias.

¡A mí también me funciona! ¡Gracias!

¡A mí también me funciona! Muchas gracias ! :D

¿Dónde pusiste (window as any).global = window; ?
Gracias.

Hola,

Justo ahí (en la imagen).

2018-05-17 21:07 GMT+02:00 Alberto Basaglia [email protected] :

donde pusiste (ventana como cualquiera) .global = ventana; ?
Gracias.


Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/socketio/socket.io-client/issues/1166#issuecomment-389975067 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/APZTlGpMwMpnAscifHT2ZQrRUSJqLejCks5tzcp3gaJpZM4QD_kq
.

--

Arnaud Tussy Vassilieff
Desarrollo web full-stack chez Leaf Websites

Sitio web: www.leaf-website.esy.es http://www.leaf-website.esy.es
Correo: a.tussy.
Teléfono: 07 77 83 29 44

donde lo pusiste...

Pon esto en tu polyfills.ts

(window as any).global = window

entre la línea 63 y 70

2018-05-31 18:31 GMT+02:00 Bibhas Bhattacharya [email protected] :

donde lo pusiste...

Pon esto en tus polyfills.ts

(ventana como cualquiera). global = ventana


Estás recibiendo esto porque comentaste.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/socketio/socket.io-client/issues/1166#issuecomment-393592879 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/APZTlPci9GKE3R8lwc1g3qfqWODeXIPiks5t4Br1gaJpZM4QD_kq
.

--

Arnaud Tussy Vassilieff
Desarrollo web full-stack chez Leaf Websites

Sitio web: www.leaf-website.esy.es http://www.leaf-website.esy.es
Correo: a.tussy.
Teléfono: 07 77 83 29 44

¡@amitport agradece que la solución que proporcionó funciona! @AngularTeam , ¿Cómo es que siguen rompiendo todo, muchachos? Incluso lograron que su gente se uniera al equipo de rxjs y, de repente, incluso rxjs rompe todo ahora en los cambios de versión... he estado al día con angular desde el primer lanzamiento estable y estoy sorprendido por su capacidad de romper todo en cada lanzamiento.

@LucasFrecia es un problema de socket.io, no de Angular. Angular hizo bien al detenerse para ocultarlo en la versión 6 (que está marcada como una versión importante de última hora)

Se agregó otra solicitud de extracción hace dos semanas https://github.com/webmodules/blob/pull/14 para https://github.com/webmodules/blob (utilizado por engine.io-parser).

No está recibiendo ninguna respuesta, ¿alguien aquí puede fusionarlo? @darrachequesne @rauchg @nkzawa?

Agregando la (ventana como cualquiera). global = ventana; a polyfills.ts funcionó para mí

@amitport gracias .
Funciona bien

Puse la (ventana como cualquiera). global = ventana en el archivo polyfills.ts
No da ReferenceError: global is not defined en localhost pero da este error si trato de ejecutar la compilación de producción con el servidor http para fines de prueba.
¿Alguna pista de por qué sucede esto?
¡Es súper urgente!

Hola @gupta82anish ,
Puse (window as any).global = window; en el archivo pollyfills.ts y ejecuté el proyecto en localhost (desarrollo) y lo construí para producción y no obtuve ningún error.
Funcionó a las mil maravillas.

La solución (window as any).global = window; en pollyfills.ts parece funcionar para mí en angular core 6.1.0. Esperemos que socket.io se actualice pronto.

(ventana como cualquiera). global = ventana; ¡en pollyfills.ts también funcionó para mí!

(window as any).global = window;
Esa es una solución muy ordenada. Pero, ¿es la forma correcta de hacer las cosas?

@avinexus7 no es la forma correcta de hacer las cosas. Es una solución para un problema abierto en socket.io-client : el uso del objeto 'global', que no existe en los navegadores.

(AFAIK, nadie está haciendo un esfuerzo para resolver este problema, vea ignorado: https://github.com/socketio/engine.io-parser/issues/99 y https://github.com/webmodules/blob/pull /14)

@amitport , ¿podría comunicarse con el soporte de NPM para que le otorguen los derechos para publicar una nueva versión del paquete blob ?

@darrachequesne - listo, envié una solicitud a NPM

(window as any).global = window
o
(window as any) = window
agregue el código anterior en el archivo polyfills.ts .

Según angular/angular-cli#8160 (comentario) :

agregar el siguiente polyfills.ts debería funcionar en Angular@6 :

// Add global to window, assigning the value of window itself.
(window as any).global = window;

En cualquier caso, este problema no debe resolverse en mi opinión, socket.io-client debe eliminar la dependencia implícita en global , o documentar que se necesita un polyfill (por cualquiera que use las fuentes preempaquetadas, no solo usuarios angulares)

(Por cierto, ¿dónde están las fuentes de los últimos [email protected] ? Tal vez podría ayudar)

Sí, esto funcionó para mí también... Gracias.

donde lo pusiste...

Pon esto en tu polyfills.ts

(window as any).global = window

@bibhas2 ¡Genial! trabajó para mi

posiblemente solucionado ahora que se lanzó https://github.com/socketio/engine.io-parser/releases/tag/2.1.3 (es posible que sea necesario reinstalar socket.io-client sin bloqueo de paquete)

no trabajar con
├─ motor. [email protected]
└─ enchufe. [email protected]

@ kartikupadhyay90 ¿puede agregar detalles?

después de actualizar a 2.2.0 en mi aplicación ReactNative, mi instancia de socket.io no recibe notificaciones del servidor. Tuve que bajar de categoría a 2.1.1

@alimek , ¿está seguro de que su error está relacionado con este problema? es así que por favor agregue detalles. De lo contrario, publique un nuevo problema

@amitport si ese es el único cambio entre la versión anterior y la 2.2.0, entonces supongo que sí

Reformulación de @alimek : si su error es _el mismo_ que este, agregue detalles. De lo contrario, abra un nuevo problema (que puede ser una regresión).

(Por cierto, no soy un mantenedor de esta biblioteca, solo estoy comentando cómo funciona el manejo de problemas en general. Si desea que se solucione su problema, debe agregar detalles procesables y publicarlos de manera adecuada)

En mi situación, parece que 2.2.0 depende de "engine.io-client": "~3.3.1", que depende de "engine.io-parser": "~2.1.1". Sin embargo, el motor.io-parser en mi sistema parece ser 2.1.2 que todavía contiene referencias a la variable 'global'. Parece que esto se solucionó en 2.1.3, pero el npm i parece estar tirando de 2.1.2

Si tuviera que adivinar, parece que podría estar volviendo a 2.1.2 porque la última compilación para 2.1.3 falló
https://travis-ci.org/socketio/engine.io-parser

Aparte de eso, no puedo entender por qué sigue sacando la versión anterior para mí.

Tengo el mismo problema con Jest + React + Typescript, y no pude solucionarlo configurando (window as any).global = window . También intenté poner el código en un archivo polyfills.ts ,

setupFiles: [
    '<rootDir>/tst/polyfills.ts',
    '<rootDir>/tst/jest.setup.ts',
  ],

y también usando el método defineProperty de Jest, pero aún no tuve suerte.

Object.defineProperty((window as any), 'global', {});

copyProps(window, global);

¿Alguien puede resolver esto para Jest, o sabe cómo puedo hacer que esto funcione? @amitport alguna idea?

Gracias,

@eldem y otros. Estoy cerrando esto ya que este hilo se convirtió en una mezcla genérica de problemas posiblemente no relacionados. Si alguien ve un problema relacionado con global y socket.io-client, abra un nuevo problema con instrucciones de reproducción, errores que se muestran en la consola, versiones utilizadas, etc.

Trabajar con Ionic4/Angular7: instalar 2.1.1 y agregar (window as any).global = window en \srcpolyfills.ts funcionó. ¡Gracias!

Para mi pregunta anterior: Babel estaba causando el error al transformar el archivo socket.io. Agregarlo en transformIgnore funcionó para mí.

transformIgnorePatterns: [
    '<rootDir>/node_modules/../lib/socket.io.js'
  ]

El método @amitport funciona perfectamente

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