2014-01-08 47 views
5

我有一个简单的node.js代码,它使用mongoose,它在保存但不检索时起作用。mongoose Model.findOne TypeError:对象没有方法'findOne'

.save()作品,但.findOne()没有。

mongoose = require('mongoose'); 
mongoose.connect("mongodb://localhost/TestMongoose"); 
UserSchema = new mongoose.Schema({ 
    field: String 
    }); 
Users = mongoose.model('userauths', UserSchema); 

user = new Users({ 
    field: 'value' 
    }); 

//user.save(); 

^作品。即用数值更新数据库。 screenshot


//user.findOne({field:'value'},function(err,value){}); 

^抛出错误:

user.findOne({field:'value'},function(err,value){}); 
    ^
TypeError: Object { field: 'value', _id: 52cd521ea34280f812000001 } has no method 'findOne' 
    at Object.<anonymous> (C:\localhost\nodeTest\z.js:16:6) 
    at Module._compile (module.js:456:26) 
    at Object.Module._extensions..js (module.js:474:10) 
    at Module.load (module.js:356:32) 
    at Function.Module._load (module.js:312:12) 
    at Function.Module.runMain (module.js:497:10) 
    at startup (node.js:119:16) 
    at node.js:901:3 

console.log(JSON.stringify( user , null, 40)); 

^只返回对象{field: 'value'}

console.log(JSON.stringify( Users , null, 40)); 

^返回undefined

Users.findOne(); 

^没有错误,但不返回任何东西。
(也是如此的功能在findOne()存在Users?但那么为什么不console.log(..Users..回报undefined?)

这可能是导致预期findOne()到不行的问题?

回答

9

findOne是您的Users型号的一种方法,而不是您的user型号实例。它通过回调提供了异步结果给调用者:

Users.findOne({field:'value'}, function(err, doc) { ... }); 
1

为了详细说明目前的答案是正确的,注意userSchema.path和userSchema.statics之间的差异 - 前者使用“这个”作为实例模型,而在后者中,'this'是指模型“类”本身:

 var userSchema = ...mongoose schema...; 

     var getUserModel = function() { 
      return mongoDB.model('users', userSchema); 
     }; 


     userSchema.path('email').validate(function (value, cb) { 
       getUserModel().findOne({email: value}, function (err, user) { 
        if (err) { 
         cb(err); 
        } 
        else if(user){ //we found a user in the DB already, so this email has already been registered 
         cb(null,false); 
        } 
        else{ 
         cb(null,true) 
        } 
       }); 
      },'This email address is already taken!'); 


    userSchema.statics.findByEmailAndPassword = function (email, password, cb) { 
       this.findOne({email: email}, function (err, user) { 
        if (err) { 
         return cb(err); 
        } 
        else if (!user) { 
         return cb(); 
        } 
        else { 
         bcrypt.compare(password, user.passwordHash, function (err, res) { 
          return cb(err, res ? user : null); 
         }); 
        } 

       }); 

      }; 

     }; 
相关问题