【问题标题】:TypeError: Object #<Strategy> has no method 'findByUsername'类型错误:对象 #<Strategy> 没有方法“findByUsername”
【发布时间】:2015-01-08 03:13:39
【问题描述】:

我正在尝试使用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 #&lt;Strategy&gt; has no method 'findByUsername'

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

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

【问题讨论】:

    标签: node.js passport.js


    【解决方案1】:

    排队

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

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

    有点疯狂的猜测建议:

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

    【讨论】:

    • 用“new LocalStrategy(users.verify.bind(users))”解决了这个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多