connect-mongo利用時に「Error setting TTL index on collection」

  • node.js 0.10.26
  • express 3.5.1
  • socket.io 0.9.16
  • mongoose 3.8.8
  • connect-mongo 0.4.0

で作ったものをHeroku/MongoHQに配備してsocket.ioのセッション張ったページを表示したままサーバ再起動したら以下のようなエラーが出た。

Error: Error setting TTL index on collection : sessions
  at /home/xxx/yyy/node_modules/connect-mongo/lib/connect-mongo.js:162:23
  at /home/xxx/yyy/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/db.js:1404:28
  at /home/xxx/yyy/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/db.js:1542:30
  at /home/xxx/yyy/node_modules/connect-mongo/node_modules/mongodb/lib/mongodb/cursor.js:159:22

で、大元のエラーが見えないのでconnect-mongo.jsの162行目の上に「console.dir(err);」を入れてみたら以下のようなものが出るなど。

[Error: Cannot determine state of server]

よく分からないのでググったら、こんなのが出てくるなど。

サングラスのナイスガイ「malixsys」が言うことにゃ、expressサーバが立ち上がる前にDBコネクションが張れればいいっぽい(もしexpressとsocketioでDB接続を分けているのであればそれもDBコネクション完了後にする必要あり)。

Wait for the DB connection before starting your Express server:

https://github.com/kcbanner/connect-mongo/issues/80#issuecomment-38713932
var MongoStore = require('connect-mongo')(express);
var options = {url: ... };
var store = new MongoStore(options, function(ret) {
  // app.listen() here
});    
app.use(express.session({
  store: store
}));

なるほど。
socket.ioのセッション張ったページはザクザク再接続しにくるからその分DBアクセスの頻度が高くて、かつ、Heroku→MongoHQなのでタイミングによってはコネクションに時間がかかって発生しやすかったのか。