ライブラリ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へ
プロジェクトとその依存関係には、実際に多数の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.ts
(src
フォルダーにあります)に追加します
@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クライアントで動作しないためです!
将来の読者のために:この問題は[email protected]
で修正され、 global
オブジェクトへの
関連するコミット:
[email protected]
含まれています)[email protected]
含まれています)さらに、Angular 11の例がここに追加されました: https :
ありがとう!
最も参考になるコメント
私は以下を追加するだけで作業を開始しました
角度6.1.0
socket.io-client 2.1.1
これは、Angular7.1.xにアップグレードした後も引き続き機能します