Socket.io-client: A biblioteca socket.io-client não é compatível com o Angular 6 mais recente

Criado em 13 mai. 2018  ·  16Comentários  ·  Fonte: socketio/socket.io-client

Eu quero:

  • [x] relatar um bug - resolvido, veja as duas últimas linhas para uma solução alternativa

A biblioteca socket.io-client não é compatível com o Angular 6. Há um erro no tempo de execução:

ReferenceError: global não está definido em Object ../ node_modules / socket.io-client / node_modules / socket.io-parser / is-buffer.js (is-buffer.js: 4)

Leia o comentário abaixo para saber mais:
https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814

Se você quiser ver esse erro por si mesmo, adicione ao aplicativo angular 6.0 um serviço simples como este abaixo:

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

O erro desaparece quando você remove a função initSocket.



Ok, existe uma solução alternativa no Angular 6 para trabalhar com o socket.io-client.
Adicionar (janela como qualquer outra) .global = janela; para polyfills.ts

bug

Comentários muito úteis

o meu começou a funcionar simplesmente adicionando o seguinte

Dentro de polyfills.ts adicione:

(window as any).global = window;

angular 6.1.0
socket.io-client 2.1.1

Isso continua a funcionar após a atualização para o angular 7.1.x

Todos 16 comentários

@darrachequesne Seria possível adicionar essas alterações a uma bifurcação do projeto até que sejam devidamente resolvidas?

@jessycormier, o que você quer dizer com "uma bifurcação do projeto"?

Um primeiro efeito colateral, parece remover o global em https://github.com/darrachequesne/has-binary/pull/4 quebras alguns aplicativos Electron: https://github.com/darrachequesne/has-binary/issues/ 5 ...

Oi. Há algum progresso? Qualquer solução? Alguma solução alternativa recomendada?

@realshaft - a

Ok, existe uma solução alternativa no Angular 6 para trabalhar com o socket.io-client.
Adicione (window as any).global = window; a polyfills.ts (localizado na pasta src )

@realshaft obrigado, funciona no angular6;)

olá @Todos ,
por favor, me ajude.
então criei um serviço para lidar com minha conexão de websocket e injetei um componente nele.
a conexão com o soquete está boa porque eu obtenho a user connected no console do servidor.
mas quando tentei enviar uma mensagem do componente, nada foi enviado.
aqui estão meus arquivos:
socketService.ts

 importar {injetável} de '@ angular / core';
 import {Observable} de 'rxjs / Observable';
 importar {Assunto} de 'rxjs / Assunto';
 importar * como io de 'socket.io-client';

 @Injectable ({
 fornecido em: 'root'
 })
 export class SocketService {

 url privado = 'http: // localhost: 3000';
 socket privado = io (this.url);

 // envia uma mensagem para o soquete
 mensagem (msg) {
 // enviar mensagem
 this.socket.emit ('chat', msg);
 }

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

 // deixe observável
 }
 }

e o arquivo do componente

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

 @Componente({
 seletor: 'app-socket',
 templateUrl: './socket.component.html',
 styleUrls: ['./socket.component.scss']
 })
 export class SocketComponent implementa OnInit {

 construtor(
 socket privado: SocketService
 ) {}

 ngOnInit () {
 }

 enviar() {
 const msg = 'olá';
 this.socket.message (msg);
 }

 }

aqui está minha conexão de servidor de soquete. eu usei MVC

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

 module.exports = (server) => {

 const io = socket (servidor);

 // WebSocket handler
 io.on ('conexão', (soquete) => {
 console.log ('um usuário conectado')
 })

 // obter a mensagem do chat
 io.on ('chat', (msg) => {
 // io.emit ('res', json.stringify (msg))
 console.log (msg);
 })

 }

Agradeço antecipadamente

aqui uma maneira um pouco hackeada de fazer funcionar:
Baixe socket.io-client de um cdn e coloque-o na pasta src com o nome socket.io-client.js

Dentro de main.ts adicione estas linhas:

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

Dentro de polyfills.ts adicione:

(window as any).global = window;

Agora você pode usar a chamada socket.io-client usando:

window['io']('localhost')

o meu começou a funcionar simplesmente adicionando o seguinte

Dentro de polyfills.ts adicione:

(window as any).global = window;

angular 6.1.0
socket.io-client 2.1.1

Isso continua a funcionar após a atualização para o angular 7.1.x

me ajuda, mas por quê?

@realshaft obrigado, funciona no angular6;)

Funcionou para mim no Angular 7.x também, obrigado.

(window as any).global = window;
Isso funcionou para mim também no Angular 7.

mesma solução funciona com angular 8

Deus não pode acreditar que eu digo isso. Mesma solução fornecida por @mjarkk . Funciona no angular10! - Para mim, a razão é que o servidor 2.x não funciona com o cliente 3.x!

Depois de 3 versões, este hack ainda funciona bem, aposto que funciona da mesma forma no angular 11.
Mas, vendo esse problema aparecer novamente, agora eu apenas aconselharia o uso de WebSockets javascript nativos, pois são suportados em todos os principais navegadores, para um tutorial para começar: https://javascript.info/websocket.

Esta página foi útil?
0 / 5 - 0 avaliações