読者です 読者をやめる 読者になる 読者になる

【Node.js】redis を使って warning: possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit.

Node.js

redisを使っていると以下のエラーが出た。

warning: possible EventEmitter memory leak detected. 11 error listeners added. Use emitter.setMaxListeners() to increase limit.

これはredisというよりもnodeのエラー。
イベントを検知するリスナーを11個セットしたからエラーになっている。

以下が問題となったコード。

var redis = require("redis");
var client = redis.createClient(
	63793, 
	'127.0.0.1', 
	{
		connect_timeout : 1000, //タイムアウト(msec)
		max_attempts : 3 //接続しに行く回数
	}
);

//DB選択
client.select(1, function(){});

//エラー検知用リスナー
client.on("error", function (err) {
	console.log("Error " + err);
});

ここで問題なのは client.on() の部分。
これはredisでエラーが発生した際に呼ばれるコールバックをセットしているが、
これはリスナーになるので、このコードが11回走ると上記のエラーが出る。
そもそもnodeはPHPなどのリクエスト&レスポンスで1プロセスというわけではない。
起動時に1回呼ぶだけでいい。

セットするリスナーが10個を越える場合は閾値を変更できたはず。