6

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

TypeError: Object #<Object> has no method 'findOne'

最近受影响的模型定义了两个新的静态方法,这些方法引用了外部模型。在退出新的静态方法后,我能够确定根本原因是外部模型的 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'). 因此,何时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
        });
    });
};
于 2013-01-13T20:53:54.633 回答