Socket.io-client: ライブラリsocket.io-clientは最新のAngular6と互換性がありません

作成日 2018年05月13日  ·  16コメント  ·  ソース: socketio/socket.io-client

したい:

  • [x]バグを報告する-解決しました。回避策については最後の2行を確認してください

ライブラリsocket.io-clientは最新のAngular6と互換性がありません。実行時にエラーが発生します。

ReferenceError:グローバルは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

このエラーを自分で確認したい場合は、以下のようなAngular6.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関数を削除すると、エラーは消えます。



わかりました。Angular6にはsocket.io-clientを操作するための回避策があります。
Add(window as any).global = window; polyfills.tsへ

bug

最も参考になるコメント

私は以下を追加するだけで作業を開始しました

polyfills.ts追加:

(window as any).global = window;

角度6.1.0
socket.io-client 2.1.1

これは、Angular7.1.xにアップグレードした後も引き続き機能します

全てのコメント16件

プロジェクトとその依存関係には、実際に多数のglobal参照があります//github.com/search?utf8 = global 93&q = global global 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アプリが破損するようです: //github.com/darrachequesne/has-binary/issues/ 5 .. ..

こんにちは。 ここに進歩はありますか? 解決策はありますか? 推奨される回避策はありますか?

@ realshaft-上記の6Webアプリで機能しました

わかりました。Angular6にはsocket.io-clientを操作するための回避策があります。
(window as any).global = window;polyfills.tssrcフォルダーにあります)に追加します

@realshaftありがとう、それはangular6で動作します;)

こんにちは@Everyone
私を助けてください。
そこで、WebSocket接続を処理するサービスを作成し、コンポーネントを挿入しました。
サーバーコンソールに a user connected されるので、ソケットへの接続は問題ありません。
しかし、コンポーネントからメッセージを送信しようとすると、何も送信されません。
これが私のファイルです:
socketService.ts

 import {Injectable} from '@ angular / core';
 import {Observable} from'rxjs / Observable ';
 import {Subject} from'rxjs / Subject ';
 import * as io from'socket.io-client ';

 @Injectable({
 ProvidedIn: 'ルート'
 })
エクスポートクラスSocketService {

 プライベートURL = 'http:// localhost:3000';
 プライベートソケット= io(this.url);

 //メッセージをソケットに送信します
 message(msg){
 //メッセージを送信します
 this.socket.emit( 'chat'、msg);
 }

 チャット(メッセージ){
 this.socket $ .emit( 'chat'、msg);

 //観察可能にする
 }
 }

およびコンポーネントファイル

 import {Component、OnInit} from '@ angular / core';
 import {SocketService} from '../../ socket.service';

 @成分({
 セレクター: 'app-socket'、
 templateUrl: './ socket.component.html'、
 styleUrls:['./ socket.component.scss']
 })
エクスポートクラスSocketComponentはOnInit {を実装します

 コンストラクタ(
 プライベートソケット:SocketService
 ){}

 ngOnInit(){
 }

 send(){
 const msg = 'こんにちは';
 this.socket.message(msg);
 }

 }

これが私のソケットサーバー接続です。 MVCを使用しました

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

 module.exports =(サーバー)=> {

 const io = socket(server);

 // WebSocketハンドラー
 io.on( 'connection'、(socket)=> {
 console.log( '接続されたユーザー')
 })

 //チャットメッセージを取得します
 io.on( 'chat'、(msg)=> {
 // io.emit( 'res'、json.stringify(msg))
 console.log(msg);
 })

 }

前もって感謝します

ここでそれを機能させるための少しハッキーな方法:
cdnからsocket.io-clientをダウンロードし、 srcという名前のsocket.io-client.js srcフォルダーに配置します。

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-client 2.1.1

これは、Angular7.1.xにアップグレードした後も引き続き機能します

それは私を助けますが、なぜですか?

@realshaftありがとう、それはangular6で動作します;)

Angular 7.xでも機能しました、ありがとう。

(window as any).global = window;
これはAngular7でも機能しました。

同じソリューションがAngular8で機能します

神は私がこれを言うとは信じられません。 同じソリューション@mjarkkが提供されています。 angle10で動作します! -私にとっての理由は、2.xサーバーが3.xクライアントで動作しないためです!

3つのバージョンの後、このハックスティルはlmaoで機能しますが、Angular11でも同じように機能するに違いありません。
しかし、この問題のポップアップが再び表示されるので、チュートリアルを開始するために、すべての主要なブラウザーでサポートされているネイティブjavascript WebSocketを使用することをお勧めします: https

将来の読者のために:この問題は[email protected]で修正され、 globalオブジェクトへの

関連するコミット:

さらに、Angular 11の例がここに追加されました: https

ありがとう!

このページは役に立ちましたか?
0 / 5 - 0 評価