情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでイベントにイベントハンドラを登録した際に警告が表示されないようにする

イベントにイベントハンドラを登録した際に下のような警告が表示されることがあります。

(node:8092) Warning: Possible EventEmitter memory leak detected. 11 new listeners added. Use emitter.setMaxListeners() to increase limit

これは1つのイベントに特定の数(デフォルトは10)より多くのイベントハンドラを登録した際には警告が表示されるようになっているからです。

そのため、イベントにイベントハンドラを登録した際に警告が表示されないようにするには警告が表示されるイベントハンドラの数を変更します。

イベントハンドラ数の変更

警告が表示されるイベントハンドラの数を変更するにはeventEmitter.setMaxListeners関数を使用します。

var events = require('events');

var eventEmitter = new events.EventEmitter();
eventEmitter.setMaxListeners(10);

第1引数に警告が表示されるイベントハンドラの数を指定します。ただし、0を指定した場合には警告が表示されなくなります。

イベントハンドラ数の取得

警告が表示されるイベントハンドラの数を取得するにはeventEmitter.getMaxListeners関数を使用します。

var max = eventEmitter.getMaxListeners();

返り値として警告が表示されるイベントハンドラの数が得られます。

サンプルコード1

event-emitter-max-listeners.js

var events = require('events');

var eh1 = function (p) {
    console.log(p.name + ' ' + p.age);
};

var eventEmitter = new events.EventEmitter();
console.log(eventEmitter.getMaxListeners());
for (var i = 0; i < 20; i++) {
    console.log(i);
    eventEmitter.on('new', eh1);
}
eventEmitter.setMaxListeners(15);
console.log(eventEmitter.getMaxListeners());
for (var i = 0; i < 20; i++) {
    console.log(i);
    eventEmitter.on('newnew', eh1);
}

実行結果

C:\work\node>node event-emitter-max-listeners.js
10
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
15
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(node:8092) Warning: Possible EventEmitter memory leak detected. 11 new listeners added. Use emitter.setMaxListeners() to increase limit
(node:8092) Warning: Possible EventEmitter memory leak detected. 16 newnew listeners added. Use emitter.setMaxListeners() to increase limit

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js