2013-01-08 106 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(用戶))」 –

相關問題