2016-07-30 43 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 => { ... }) 
}) 

代碼工作很好,但我不知道我怎麼會.on('message', ...)監聽器添加到WS類,讓所有新WS對象將有它。我試過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實例?

爲此,我建議你只是爲了創建一個工廠來處理它。

WsFactory.create = function() { 
    var ws = new WS(); //or whatever you use for creating 
    ws.on(...); 
    return ws; 
} 

你會避免變異的原型,並會得到你想要的。