【问题标题】:Mongoose TypeError on a model's findOne method模型 findOne 方法上的 Mongoose TypeError
【发布时间】:2012-12-27 19:02:48
【问题描述】:

在一些旧代码中出现以下 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);

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

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

【问题讨论】:

    标签: javascript node.js mongoose


    【解决方案1】:

    这是已知的 node.js 问题。这意味着您在代码中的某处需要循环,而 node.js 禁止它。

    正确的做法是使用mongoose.model 方法。因此,您应该使用mongoose.model('UserModel') 而不是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
            });
        });
    };
    

    【讨论】:

    • ./user.js 是定义 UserModel 的地方。那里没有要求。我不明白你的答案 - var UserModel = mongoose.model('UserModel') - 失败,因为它不知道架构是什么(在 user.js 中定义)。
    • 去掉require,把UserModel.findOne()改成mongoose.model('UserModel').findOne()
    • 您是否在'./user' 中定义了UserModel?喜欢module.exports = mongoose.model('UserModel', UserSchema);?如果你有,那么mongoose.model('UserModel') 应该可以正常工作。至于循环要求,我不确定它是你的情况,但它看起来像。
    • 是的,我在 ./user 中定义了 UserModel。我没有看到循环,但是在静态方法中替换了 UserModel 引用,GroupModel 再次正常工作。那是个混蛋-谢谢!
    • 永远不会猜到这一点。谢谢!有人知道为什么 Node 在发生这种情况时不记录警告或其他什么吗?
    猜你喜欢
    • 2019-01-15
    • 2016-02-10
    • 2021-12-04
    • 2014-12-15
    • 2012-05-08
    • 1970-01-01
    • 2015-10-26
    • 2017-11-16
    • 2021-01-22
    相关资源
    最近更新 更多