2017-12-08 1 views
1

私はnodejsとsocketを初めて使っていますので、私のio変数を別のコントローラやファイルにアクセスして、io変数を私のioをglobal.ioとして定義することは安全ですか?

global.io = require('socket.io').listen(server); 
ので、今、私のioは私のcontrolllerのいずれかでアクセス

私はそれが難しいかもしれない別の変数、と重複する場合には、クラッシュを引き起こす可能性があり、このリンクhere

+0

[NodeJSでグローバル変数を使用しても安全ですか?](https://stackoverflow.com/questions/19572166/is-it-safe-to-use-and-update-global-variables) -in-nodejs) –

答えて

0

からこのアイデアを得ましたあなたのプロジェクトがかなり大きく、かつ/または含まれている場合はトラック/ハンドル多くの図書館員は、アプリケーションの存続期間中も存在し、したがってリソースを占有しています。グローバル変数を使用することは全体的に悪い習慣とみなされます。

あなたがここでのNode.jsでのグローバル変数についての素晴らしい記事をチェックアウトすることができます - http://stackabuse.com/using-global-variables-in-node-js/

EDITを:あなたは安全性を言及しているので、それは理論上安全である、ちょうどお勧めできません。

0

ほとんどの場合、グローバル変数はソフトウェア設計が不良であることを示しています。より良いアプローチは、すべてのIOコードを別個のクラス/モジュールに含めることです。ここで私が何を意味するか説明する短いコード片があります:

const socketIO = require('socket.io'); 
class myIO { 
    construct(server) { 
     this.io = socketIO.listen(server) 
    } 

    doStuff() { 
     // do stuff with your io socket 
    } 
} 

module.exports = myIO; 

今すぐあなたのコントローラにmyIOのインスタンスを提供する必要がありますが、私はあなたの場合にコントローラを構成するものはよく分かりません。そして、毎回ソケットを再接続する必要がありますか、同じソケットを再利用する必要がありますか?

あなたが依存性注入パターンに見えるORシングルトンを使用する場合がありますいずれかの方法:この場合

module.exports = new myIO(); 

は(「myio」)は、常に同じソケットを返す必要があります。または、フレームワークにレジストリがある場合は、そのレジストリを使用できます。

+0

私はあなたが何を言っているのかは分かりませんが、app.jsでサーバーのインスタントが作成されるため、どのファイルから関数を構築するためにサーバーパラメータを渡すことができますか?どうすれば別のファイルから渡すことができますか? –

+0

ioサーバを任意のモジュールファイル(例えば、 'module.exports = socketIO.listen(server)')にエクスポートし、後でコントローラファイルから要求します。 'const io = require( './ my-io')' – Crogo

関連する問題