模型的findOne方法上的Mongoose TypeError

Gre*_*reg 5 javascript mongoose node.js

在一些旧代码中出现了以下TypeError.

TypeError: Object #<Object> has no method 'findOne'
Run Code Online (Sandbox Code Playgroud)

最近受影响的模型定义了两个新的静态方法,这些方法引用了外部模型.在退出新的静态方法之后,我能够确定外部模型的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);
Run Code Online (Sandbox Code Playgroud)

应用程序中有一个代码片段调用GroupModel.findOne({name:'gogo'}),导致TypeError.当我在GroupSchema中删除UserModel的require语句时,应用程序代码再次起作用.

为什么Javascript开始认为findOne()是一个添加了require语句的实例方法?

Leo*_*tny 14

这是已知的node.js问题.这意味着你需要在代码中的某个地方进行循环,而node.js禁止它.

正确的方法是使用mongoose.model方法.所以,UserModel你应该使用而不是变量mongoose.model('UserModel').所以,什么时候findSomeUsers调用mondoose会获取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
        });
    });
};
Run Code Online (Sandbox Code Playgroud)

  • 永远不会猜到这一点.谢谢!任何人都知道为什么Node在发生这种情况时不会记录警告或其他事情? (3认同)