2015-06-04 77 views
2

我想为我的用户模型创建一个“checkPassword”的方法,但是每当我把它叫做我收到以下错误:猫鼬方法未定义

User.checkPassword(password, hash, function(err, samePassword){ 
      ^
TypeError: undefined is not a function 

我是很新,猫鼬所以我我不知道我要去哪里错。

users.js(用户模式)

var mongoose = require('mongoose'), 
Schema = mongoose.Schema, 
bcrypt = require('bcrypt'); 


var userSchema = new Schema({ 
email : {type: String, required: true, unique: true}, 
password : {type: String, required: true}, 
firstName : {type: String}, 
lastName : {type: String} 
}); 


userSchema.methods.checkPassword = function checkPassword(password, hash, done){ 

    bcrypt.compare(password, hash, function(err, samePassword) { 
     if(samePassword === true){ 
     done(null, true); 
     } else { 
     done(null, false) 
     } 
    }); 
} 

module.exports = mongoose.model('User', userSchema); 

passport.js

var passport = require('passport'), 
    LocalStrategy = require('passport-local').Strategy, 
    mongoose = require('mongoose'), 
    usersModel = require('../models/users'), 
    User = mongoose.model('User'); 


passport.use(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'password' 
    }, function(email, password, done){ 

    User.findOne({'email': email}, function(err, user){ 
     if(user){ 

     var hash = user.password; 
     User.checkPassword(password, hash, function(err, samePassword){ 
      if(samePassword === true){ 
      done(null, user); 
      } 

等。

如果我CONSOLE.LOG用户模型(在护照的开始。 JS),我可以看到该方法在那里,但我无法使用它。我的模型布局与文档中的类似:http://mongoosejs.com/docs/guide.html(实例方法部分)。

回答

4

你声明一个实例方法(指在User模型/类的实例调用),但你调用它作为一个方法(在猫鼬的说法一static method)。

这里有一个小的演示:

var mongoose = require('mongoose'); 
var testSchema = new mongoose.Schema({ test : String }); 

testSchema.methods.myFunc = function() { 
    console.log('test!'); 
}; 

var Test = mongoose.model('Test', testSchema); 

// This will fail, because you're calling a class method. 
Test.myFunc(); 

// This will work, because you're calling the method on an instance. 
var test = new Test(); 
test.myFunc(); 

因此,在你的代码,您应该更换由user.checkPassword(...)User.checkPassword(...)(并重写了一点),或者通过使用userSchema.statics.checkPassword = function(...)使其成为合适的类方法。

+0

感谢这个例子 - 它很容易理解。将其更改为'userSchema.statics.checkPassword'工作。 为什么我想要使用{modelSchema} .methods vs {modelSchema} .statics有偏好吗? –

+1

@AshleyB实例方法用于针对单个文档执行操作。在你的情况下,'checkPassword()'作为一个实例方法是有意义的,因为你有一个你想验证密码的文件('user')。静态方法主要用于与整个模型/集合相关的动作,如查找特定文档(链接的Mongoose文档中的“Animal.findByName()”就是一个很好的例子)。 – robertklep