Library socket.io-client tidak kompatibel dengan Angular 6 terbaru. Ada kesalahan pada waktu eksekusi:
ReferenceError: global tidak didefinisikan di Object ../ node_modules / socket.io-client / node_modules / socket.io-parser / is-buffer.js (is-buffer.js: 4)
Silakan baca komentar di bawah untuk mengetahui lebih lanjut:
https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814
Jika Anda ingin melihat kesalahan ini sendiri, tambahkan ke layanan sederhana aplikasi angular 6.0 seperti di bawah ini:
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();
}
}
Kesalahan menghilang saat Anda menghapus fungsi initSocket.
Oke, ada solusi di Angular 6 untuk bekerja dengan socket.io-client.
Tambahkan (window sebagai apapun) .global = window; ke polyfills.ts
Memang ada sejumlah referensi global
dalam proyek dan dependensinya: 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 + extension% 3A.js & type = Code & ref = advsearch & l = & l =
Saya tidak yakin tentang efek samping dari menghapus referensi ini.
@darrachequesne Apakah mungkin untuk menambahkan perubahan ini ke garpu proyek sampai diselesaikan dengan benar?
@jessycormier apa yang Anda maksud dengan "garpu proyek"?
Efek samping pertama, tampaknya menghapus global di https://github.com/darrachequesne/has-binary/pull/4 merusak beberapa aplikasi Electron: https://github.com/darrachequesne/has-binary/issues/ 5 ...
Hai. Apakah ada kemajuan? Ada solusi? Ada solusi yang disarankan?
@realshaft - solusi di atas berhasil untuk saya di aplikasi web Ionic 4 / Angular 6
Oke, ada solusi di Angular 6 untuk bekerja dengan socket.io-client.
Tambahkan(window as any).global = window;
kepolyfills.ts
(terletak di foldersrc
)
@realshaft terima kasih, ini berfungsi di angular6;)
halo @Setiap orang ,
tolong bantu saya.
jadi saya membuat layanan untuk menangani koneksi websocket saya dan memasukkannya ke dalam komponen.
koneksi ke soket baik-baik saja karena saya mendapatkan a user connected
di konsol server.
tetapi ketika saya mencoba mengirim pesan dari komponen tidak ada yang dikirim.
ini file saya:
socketService.ts
impor {Injectable} dari '@ angular / core'; impor {Observable} dari 'rxjs / Observable'; impor {Subject} dari 'rxjs / Subject'; impor * sebagai io dari 'socket.io-client'; @Infokat ({ disediakan di: 'root' }) kelas ekspor SocketService { url pribadi = 'http: // localhost: 3000'; soket pribadi = io (this.url); // kirim pesan ke socket pesan (pesan) { // kirim pesan this.socket.emit ('chat', msg); } obrolan (pesan) { this.socket $ .emit ('chat', msg); // biarkan diamati } }
dan file komponen
impor {Komponen, OnInit} dari '@ angular / core'; impor {SocketService} dari '../../socket.service'; @Komponen({ pemilih: 'app-socket', templateUrl: './socket.component.html', styleUrls: ['./socket.component.scss'] }) kelas ekspor SocketComponent mengimplementasikan OnInit { konstruktor ( soket pribadi: SocketService ) {} ngOnInit () { } Kirim() { const msg = 'halo'; this.socket.message (msg); } }
ini koneksi server soket saya. saya menggunakan MVC
const gameModel = membutuhkan ('../ models / game') const userModel = membutuhkan ('../ models / users') const wsModel = membutuhkan ('../ models / socket') const socket = membutuhkan ('socket.io') module.exports = (server) => { const io = soket (server); // Penangan WebSocket io.on ('koneksi', (soket) => { console.log ('pengguna terhubung') }) // dapatkan pesan obrolan io.on ('chat', (msg) => { // io.emit ('res', json.stringify (msg)) console.log (msg); }) }
Terima kasih sebelumnya
di sini cara yang sedikit hack untuk membuatnya bekerja:
Unduh socket.io-client dari cdn Dan letakkan di folder src
dengan nama socket.io-client.js
Di dalam main.ts
tambahkan baris ini:
import * as io_ from './socket.io-client.js';
window['io'] = io_;
Di dalam polyfills.ts
tambahkan:
(window as any).global = window;
Sekarang Anda dapat menggunakan panggilan socket.io-client
menggunakan:
window['io']('localhost')
milik saya mulai bekerja hanya dengan menambahkan yang berikut ini
Di dalam
polyfills.ts
tambahkan:(window as any).global = window;
sudut 6.1.0
socket.io-client 2.1.1
Ini terus berfungsi setelah meningkatkan ke sudut 7.1.x.
itu membantu saya, tapi mengapa?
@realshaft terima kasih, ini berfungsi di angular6;)
Itu berhasil untuk saya di Angular 7.x juga, terima kasih.
(window as any).global = window;
Ini bekerja untuk saya juga di Angular 7.
solusi yang sama bekerja dengan sudut 8
Tuhan tidak percaya saya mengatakan ini. Solusi yang sama disediakan @mjarkk . Bekerja di angular10! - Bagi saya, alasannya adalah server 2.x tidak berfungsi dengan klien 3.x!
Setelah 3 versi hack ini masih berfungsi lmao, saya yakin itu berfungsi sama di sudut 11.
Tetapi melihat masalah ini muncul lagi, saya sekarang hanya akan menyarankan untuk menggunakan javascript WebSockets asli karena didukung di semua browser utama, untuk tutorial memulai: https://javascript.info/websocket.
Untuk pembaca selanjutnya: masalah ini telah diperbaiki di [email protected]
, tidak ada lagi referensi ke objek global
.
Komit terkait:
[email protected]
)[email protected]
)Selain itu: contoh dengan Angular 11 telah ditambahkan di sini: https://github.com/socketio/socket.io/tree/master/examples/angular-todomvc
Terima kasih!
Komentar yang paling membantu
milik saya mulai bekerja hanya dengan menambahkan yang berikut ini
sudut 6.1.0
socket.io-client 2.1.1
Ini terus berfungsi setelah meningkatkan ke sudut 7.1.x.