6

次の 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 ステートメントを追加したインスタンス メソッドであると考え始めるのですか?

4

1 に答える 1

16

これは、node.jsの既知の問題です。これは、コードのどこかにループが必要であり、node.jsがそれを禁止していることを意味します。

それを行う正しい方法は、mongoose.modelメソッドを使用することです。したがって、UserModel変数の代わりにを使用する必要がありますmongoose.model('UserModel')。したがって、findSomeUsersmondooseが呼び出されるとUserModel、そのfindメソッドがフェッチされて呼び出されます。

GroupSchema.statics.findSomeUsers = function(group, callback) {
    this.find({name : session_user._id}, function(err, groups) {
        mongoose.model('UserModel').find({_id : {$in : group.users}}, function(err,patients) {
            // do magic
        });
    });
};
于 2013-01-13T20:53:54.633 に答える