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
De fato, existem várias referências global
no projeto e suas dependências: 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 + extensão% 3A.js & type = Código & ref = advsearch & l = & l =
Não tenho certeza sobre os efeitos colaterais da remoção dessas referências.
@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;
apolyfills.ts
(localizado na pastasrc
)
@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.
Para futuros leitores: este problema foi corrigido em [email protected]
, não há mais referência ao objeto global
.
Commits relacionados:
[email protected]
)[email protected]
)Além disso: um exemplo com Angular 11 foi adicionado aqui: https://github.com/socketio/socket.io/tree/master/examples/angular-todomvc
Obrigado!
Comentários muito úteis
o meu começou a funcionar simplesmente adicionando o seguinte
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