مكتبة socket.io-client غير متوافقة مع أحدث إصدار من Angular 6. يوجد خطأ في وقت التنفيذ:
ReferenceError: لم يتم تعريف global في Object ../ node_modules / socket.io-client / node_modules / socket.io-parser / is-buffer.js (is-buffer.js: 4)
يرجى قراءة التعليق أدناه لمعرفة المزيد:
https://github.com/angular/angular-cli/issues/9827#issuecomment -369578814
إذا كنت تريد أن ترى هذا الخطأ بنفسك ، أضف إلى خدمة تطبيق angular 6.0 البسيطة مثل تلك أدناه:
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();
}
}
يختفي الخطأ عند إزالة وظيفة initSocket.
حسنًا ، هناك حل بديل في Angular 6 للعمل مع socket.io-client.
أضف (نافذة كأي). global = window ؛ إلى polyfills.ts
يوجد بالفعل عدد من المراجع global
في المشروع وتبعياته: 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 =
لست متأكدًا من الآثار الجانبية لإزالة هذه الإشارات.
darrachequesne هل سيكون من الممكن إضافة هذه التغييرات إلى مفترق المشروع حتى يتم حلها بشكل صحيح؟
jessycormier ماذا تقصد ب "مفترق المشروع"؟
من الآثار الجانبية الأولى ، يبدو أن إزالة العالمية في https://github.com/darrachequesne/has-binary/pull/4 تكسر بعض تطبيقات Electron: https://github.com/darrachequesne/has-binary/issues/ 5 ...
مرحبا. هل يوجد أي تقدم؟ اي حل؟ أي حل موصى به؟
realshaft - لقد
حسنًا ، هناك حل بديل في Angular 6 للعمل مع socket.io-client.
أضف(window as any).global = window;
إلىpolyfills.ts
(موجود في المجلدsrc
)
realshaft ، شكرًا لك ، إنه يعمل في angular6 ؛)
مرحبا @ الجميع ،
أرجوك أن تساعدني.
لذلك قمت بإنشاء خدمة للتعامل مع اتصال websocket الخاص بي وحقنته مكونًا.
الاتصال بالمقبس جيد حيث أحصل على a user connected
في وحدة تحكم الخادم.
ولكن عندما حاولت إرسال رسالة من المكون ، لم يتم إرسال أي شيء.
ها هي ملفاتي:
socketService.ts
استيراد {Injectable} من "@ angular / core" ؛ استيراد {Observable} من 'rxjs / Observable' ؛ استيراد {الموضوع} من "rxjs / الموضوع" ؛ استيراد * كـ io من "socket.io-client" ؛ @ حقن ({ المقدمة في: "الجذر" }) تصدير فئة SocketService { url الخاص = 'http: // localhost: 3000'؛ مقبس خاص = io (this.url) ؛ // إرسال رسالة إلى المقبس رسالة (رسالة) { // أرسل رسالة this.socket.emit ("دردشة"، msg) ؛ } دردشة (رسالة) { this.socket $ .emit ("دردشة"، msg)؛ // دعنا نلاحظ } }
وملف المكون
استيراد {Component، OnInit} من "@ angular / core" ؛ استيراد {SocketService} من "../../socket.service" ؛ @مكون({ المحدد: "app-socket" ، templateUrl: "./socket.component.html" ، styleUrls: ['./socket.component.scss'] }) فئة التصدير SocketComponent تنفذ OnInit { البناء( المقبس الخاص: SocketService ) {} ngOnInit () { } إرسال() { msg const = 'hello' ؛ this.socket.message (msg) ؛ } }
هنا اتصال خادم المقبس الخاص بي. لقد استخدمت MVC
const gameModel = تتطلب ("../ نماذج / لعبة") const userModel = تتطلب ("../ نماذج / المستخدمون") const wsModel = تتطلب ('../ نماذج / مقبس') مقبس const = يتطلب ('socket.io') module.exports = (الخادم) => { const io = المقبس (الخادم) ؛ // معالج WebSocket io.on ("اتصال" ، (مقبس) => { console.log ("مستخدم متصل") }) // الحصول على رسالة الدردشة io.on ('دردشة'، (msg) => { // io.emit ('res'، json.stringify (msg)) console.log (msg) ؛ }) }
شكرا لكم مقدما
إليك طريقة مبتكرة بعض الشيء لجعلها تعمل:
قم بتنزيل socket.io-client من قرص مضغوط وضعه في المجلد src
يحمل الاسم socket.io-client.js
داخل main.ts
أضف هذه الأسطر:
import * as io_ from './socket.io-client.js';
window['io'] = io_;
داخل polyfills.ts
أضف:
(window as any).global = window;
الآن يمكنك استخدام الاتصال بـ socket.io-client
باستخدام:
window['io']('localhost')
بدأت عملي بمجرد إضافة ما يلي
داخل
polyfills.ts
أضف:(window as any).global = window;
الزاوي 6.1.0
socket.io العميل 2.1.1
يستمر هذا العمل بعد الترقية إلى 7.1.x الزاوي
انها تساعدني ولكن لماذا؟
realshaft ، شكرًا لك ، إنه يعمل في angular6 ؛)
لقد نجحت أيضًا في Angular 7.x ، شكرًا.
(window as any).global = window;
لقد نجح هذا أيضًا بالنسبة لي في Angular 7.
نفس الحل يعمل مع الزاوية 8
لا أصدق أني أقول هذا. تم توفير نفس الحل mjarkk . يعمل في angular10! - السبب بالنسبة لي هو أن خادم 2.x لا يعمل مع عميل 3.x!
بعد 3 إصدارات ، يعمل هذا الاختراق مع lmao ، أراهن أنه يعمل بنفس الطريقة في الزاوية 11.
لكن عند رؤية هذه المشكلة المنبثقة مرة أخرى ، أود الآن أن أنصح فقط باستخدام https://javascript.info/websocket.
للقراء في المستقبل: تم إصلاح هذه المشكلة في [email protected]
، ولم يعد هناك أي مرجع للكائن global
.
الالتزامات ذات الصلة:
[email protected]
)[email protected]
)إلى جانب ذلك: تمت إضافة مثال مع Angular 11 هنا: https://github.com/socketio/socket.io/tree/master/examples/angular-todomvc
شكر!
التعليق الأكثر فائدة
بدأت عملي بمجرد إضافة ما يلي
الزاوي 6.1.0
socket.io العميل 2.1.1
يستمر هذا العمل بعد الترقية إلى 7.1.x الزاوي