2016-07-30 17 views
0

私はwsのWebSocketサーバーを実行しています。受信メッセージがJSONかどうかに基づいて分割しようとしています。オブジェクトプロトタイプにリスナーを追加します

function determineJSON(m) { 
    try   { return ['json', JSON.parse(m)] } 
    catch (err) { return ['not-json', m] } 
} 

wss.on('connection', ws => { 
    ws.on('message', m => { 
     // Emit to 'json' and 'not-json' as appropriate 
     if (ws.listenerCount('json') + ws.listenerCount('not-json') > 0) { 
      ws.emit(...determineJSON(m)) 
     } 
    }) 
    .on('json', j => { ... }) 
    .on('not-json', m => { ... }) 
}) 

コードは素晴らしい作品が、私はすべての新しいWSオブジェクトがそれを持っているなるように、私は、WSクラスに.on('message', ...)リスナーを追加することができますどのように思っていました。私はWS.prototype.on('message', ...)を試しましたが、それは何もしていないようです。

+1

サブクラスを作成し、コンストラクタに追加します。 – Bergi

答えて

0

あなたが何か行うことができますので、まあ、私は、プロトタイプの修正の大ファンではない:あなたはクラス自体を変更したい場合は、おそらくのような何かをする必要があります。とにかく

function determineJSON(m) { 
    try   { return ['json', JSON.parse(m)] } 
    catch (err) { return ['not-json', m] } 
} 

function decorateWS(ws) { 
    return ws.on('message', m => { 
     // Emit to 'json' and 'not-json' as appropriate 
     if (ws.listenerCount('json') + ws.listenerCount('not-json') > 0) { 
      ws.emit(...determineJSON(m)) 
     } 
    }) 
} 

wss.on('connection', ws => { 
    decorateWS(ws).on('json', j => { ... }) 
        .on('not-json', m => { ... }) 
}) 

を:

let origConstructor = ws.prototype.constructor; 
WS.prototype.constructor =() => { 
    origConstructor.apply(this, arguments); 
    const ws = this; 
    this.on('message', m => { 
     // Emit to 'json' and 'not-json' as appropriate 
     if (ws.listenerCount('json') + ws.listenerCount('not-json') > 0) { 
      ws.emit(...determineJSON(m)) 
     } 
    }) 
} 

いずれにしても、これには副作用があると思われます。だから、装飾的なアプローチははるかに優れており、保守的です。

1

実際に、事前定義された状態のWSのインスタンスを作成する必要がありますか?

私はあなたのためにそれを処理するファクトリを作成することをお勧めします。

プロトタイプの変更を避けることで、必要なものを得ることができます。

関連する問題