Socket.io-client: مكتبة socket.io-client غير متوافق مع أحدث Angular 6

تم إنشاؤها على ١٣ مايو ٢٠١٨  ·  16تعليقات  ·  مصدر: socketio/socket.io-client

أريد أن:

  • [x] أبلغ عن خطأ تم حله ، ابحث عن آخر سطرين للحصول على حل بديل

مكتبة 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

bug

التعليق الأكثر فائدة

بدأت عملي بمجرد إضافة ما يلي

داخل polyfills.ts أضف:

(window as any).global = window;

الزاوي 6.1.0
socket.io العميل 2.1.1

يستمر هذا العمل بعد الترقية إلى 7.1.x الزاوي

ال 16 كومينتر

يوجد بالفعل عدد من المراجع 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 .

الالتزامات ذات الصلة:

إلى جانب ذلك: تمت إضافة مثال مع Angular 11 هنا: https://github.com/socketio/socket.io/tree/master/examples/angular-todomvc

شكر!

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

Sairyss picture Sairyss  ·  4تعليقات

catamphetamine picture catamphetamine  ·  3تعليقات

newpanjing picture newpanjing  ·  3تعليقات

yesterday24 picture yesterday24  ·  4تعليقات

ahadcove picture ahadcove  ·  7تعليقات