0

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

用户.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

4

1 回答 1

0

在行

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

您正在将函数传递给 LocalStrategy ,这会改变它的上下文(函数是 JavaScript 中的一等公民)。this不再指向 User 对象,而是指向 Strategy。因此,您需要将您的函数绑定到用户上下文。

有点疯狂的猜测建议:

Users.prototype.verify = function(username, password, done) {
    this.findByUsername(username, function(err, user) {
        done(null, user);
    });
}.bind(Users.prototype);
于 2013-01-08T21:47:42.817 回答