mongooseのmodelつくるところではまった

このコードはエラる。mongooseのバージョンは1.6.0。

var mongoose = require('mongoose');
mongoose.connect('mongodb://localhost/mydb', function() {
  var UserSchema = new mongoose.Schema({
    name: { type: String, unique: true }
  });
  mongoose.model('User', UserSchema);
  mongoose.disconnect();
});

コード追ってみたら mongoose.model('User', UserSchema) の内部でindex作る処理が非同期で走るんだけど、それが実行される前にdisconnectが先に実行されちゃうからみたい。でもmodelメソッドがコールバックとらないのでちと困った。考えた対応策は二つ。

一つ目はindexをつくる処理をとめる方法。

mongoose.model('User', UserSchema, true);

model.init(index作る処理)をスキップするかどうかを指定できるのでそれでとめる。こういう処理書くときってテストとかCLIスクリプトがほとんどなので、そのときはindexつくる処理いらないかなという判断。

二つ目は、indexつくったときに emit('index') されてるので

mongoose.model('User', UserSchema).on('index', function() {
  mongoose.disconnect();
});

とかしちゃう。でもこれSchemaがindexつくらないSchemaだったらイベントが発火しないのでmodel.schema.indexes.lengthとかを見て判断する必要があるっぽい。あとこれだとSchemaいっぱいのときめんどい。