次の TypeError は、一部の古いコードで発生しました。
TypeError: Object #<Object> has no method 'findOne'
最近影響を受けたモデルには、2 つの新しい静的メソッドが定義されており、それらのメソッドは外部モデルを参照していました。新しい静的メソッドを撤回した後、根本的な原因が外部モデルの require ステートメントであると判断できました。パターンは次のようになります。
var UserModel = require('./user');
var GroupSchema = new Schema({
name: String,
users: [{ type : Schema.ObjectId, ref: 'UserModel'}],
});
GroupSchema.statics.findSomeUsers = function(group, callback) {
this.find({name : session_user._id}, function(err, groups) {
UserModel.find({_id : {$in : group.users}}, function(err,patients) {
// do magic
});
});
};
module.exports = mongoose.model('GroupModel', GroupSchema);
TypeError を引き起こす GroupModel.findOne({name:'gogo'}) を呼び出すアプリケーションのコード フラグメントがあります。GroupSchema で UserModel の require ステートメントを削除すると、アプリ コードが再び機能します。
なぜ Javascript は findOne() が require ステートメントを追加したインスタンス メソッドであると考え始めるのですか?