swdyh

node_redisのエラーハンドリング

2012-07-04 11:22:00

node_redisを使うときにエラーをハンドリングしていないと、接続に失敗したときにプロセスごと死んでしまう。このときのエラーはtry catchだと補足できないので、onメソッドでerrorイベントを補足するようにしないといけない。errorイベントは特殊なイベントで、このイベントを補足しておくと、他になにもしなくてもプロセスが死ぬことがなくなって再接続まで自動でやってくれる。

var util = require('util')
var redis = require('redis')

var c = redis.createClient()
c.on('error', function(err) {
    util.log('redis_err ' + String(err))
})

connect-redisを使ってセッションをredisに保存する場合、RedisStoreのclientがredisクライアントなので、そこにエラー処理を書いておく。

var util = require('util')
var express = require('express')
var RedisStore = require('connect-redis')(express)

var rs = new RedisStore()
rs.client.on('error', function(err) {
    util.log('redis_err ' + String(err))
})

var app = express.createServer()
app.use(express.cookieParser())
app.use(express.session({ secret: 'xxx', store: rs }))

app.get('/', function(req, res) {
    req.session.count = req.session.count || 1
    res.send(String(req.session.count++))
})
app.listen(9999)

nodeのプロセスを動かしてからredis-serverを再起動してみると、エラーが補足さることと再接続されることが確認できる。

サーバ起動時にredis-serverもnodeも動かすようにしていたら、redis-serverのが起動が遅くてnodeの方が死んでいたみたいなことがあった。redisを使うときはいつでもエラーイベントを補足するようにした方がいい。

mranney/node_redis GitHub https://github.com/mranney/node_redis