2017-12-12 10 views
1

私のNode.JSアプリでは、TCP接続を介してwriter関数を再帰的に実行する必要があります。これは、どのように私はそれをやっているされていますMaxListenersExceeded socket.pipeを再帰的に使用する場合の警告

var net = require('net'); 
const commonConfig = require('../config.common') 

var server = net.createServer(function(socket) { 

    let writer =() => { 
     socket.write(Date.now() + '\n\r') 
     socket.pipe(socket) 
     setTimeout(writer, 1000) 
    } 
    writer() 
}); 

server.listen(commonConfig.TCP_PORT, commonConfig.TCP_ADDR); 

はしかし、私は次の警告を得る:

(node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 end listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 finish listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 unpipe listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 drain listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 data listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit (node:4497) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 close listeners added. Use emitter.setMaxListeners() to increase limit

これらによって引き起こされており、どのように私は私の機能を壊すことなく、これらを解決することができますか?

答えて

0

最近、同様の問題がパイプラインで発生し、最大リスナー警告が発生しました。私はイベントリスナーを使用していませんが、リソースを厳密に配管しています。 sourcePipe.pipe(writablePipe)のように、同じソースからデータを受け取るために書き込み可能なパイプを多すぎると、nodejsは警告を出します。

--trace-warningsフラグを使用してアプリケーションを起動すると、どこに問題が発生しているかを詳細に確認できます。これはまさに配管が行われているコードです。 node --trace-warnings app.js。そのフラグをアプリに渡すことで、問題の詳細を把握できます。

(node:5676) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 data listeners added. Use emitter.setMaxListeners() to increase limit 
at _addListener (events.js:281:19) 
at Mp4Frag.addListener (events.js:298:10) 
at Mp4Frag.Readable.on (_stream_readable.js:775:35) 
at Mp4Frag.Readable.pipe (_stream_readable.js:638:7) 
at Socket.socket.on (L:\WebstormProjects\ffmpeg-streamer\sockets\mse.js:83:33) 
at emitOne (events.js:115:13) 
at Socket.emit (events.js:210:7) 
at L:\WebstormProjects\ffmpeg-streamer\node_modules\socket.io\lib\socket.js:513:12 
at _combinedTickCallback (internal/process/next_tick.js:131:7) 
at process._tickCallback (internal/process/next_tick.js:180:9) 

それは私がメモリリークを引き起こす任意の未処理のリスナーを持っているので、それがない知っているので、私はこれに困惑されているmp4frag.pipe(writable);

あるmse.jsファイルの83行目を指します。私たちはデュー・デリジェンスを行って以来、最大リスナーの限界を増やすことが正当化されていると思います。

私のソースパイプで、いくつかのコードを追加しましたmp4frag.setMaxListeners(20);今、私がその数を超えると、私はの私の設定値が使用されていると私に言っている MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 21 end listeners added. Use emitter.setMaxListeners() to increase limitを得る。

関連する問題