0

私は次のように使用しようとして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のインスタンスに設定されるのでしょうか。StrategyUsers

4

1 に答える 1

0

ラインで

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

関数を LocalStrategy に渡しているため、そのコンテキストが変更されています (関数は JavaScript のファーストクラス市民です)。thisUser オブジェクトではなく、Strategy を指します。したがって、関数を Users コンテキストにバインドする必要があります。

ちょっとした推測の提案:

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 に答える