TypeError:Object#<strategy>没有方法'findByUsername'</strategy>

时间:2013-01-08 21:01:09

标签: node.js passport.js

我正在尝试使用passport-local,如下所示:

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的实例呢?

1 个答案:

答案 0 :(得分:0)

在第

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

您正在将该函数传递给LocalStrategy,后者更改了它的上下文(函数是JavaScript中的一等公民)。 this不再指向User对象,而是指向策略。因此,您需要将您的函数绑定到Users上下文。

一些狂野的猜测建议:

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