2013-01-08 75 views
0

我试图用passport-local如下:类型错误:对象#<Strategy>有没有方法 'findByUsername'

users.js:

var Users = function() {} 
Users.prototype.findByUsername = function(username, cb) { 
    var user = { name: username }; 
    cb(null, user); 
}; 
Users.prototype.verify = function(username, password, done) { 
    this.findByUsername(username, function(err, user) { 
     done(null, user); 
    }); 
}; 

module.exports = Users; 

app.js

var Users = require('./users'); 
var users = new Users(); 

passport.use(new LocalStrategy(users.verify)); 

当我尝试登录时,我得到TypeError: Object #<Strategy> has no method 'findByUsername'

我是新来的Javascript(和node.js),但我做了一些搜索,我想我正确使用构造函数模式。

那么为什么this设置为Strategy的实例,而不是Users的实例?

回答

0

在您传递的功能LocalStrategy从而改变它的上下文行

passport.use(new LocalStrategy(users.verify)); 

(函数是一等公民在JavaScript)。 this不再指向用户对象,而是指向策略。因此你需要将你的函数绑定到Users上下文。

胡乱猜测暗示了一下:

Users.prototype.verify = function(username, password, done) { 
    this.findByUsername(username, function(err, user) { 
     done(null, user); 
    }); 
}.bind(Users.prototype); 
+0

与解决它的 “新LocalStrategy(users.verify.bind(用户))” –

相关问题