护照投掷user.authenticate不是函数

时间:2017-03-05 17:31:16

标签: node.js express passport.js

我之前已经问过这个问题,但我找不到合适的答案。 这是控制台错误。

TypeError: user.authenticate is not a function
at /home/sinnedde/WebstormProjects/web-services/config/strategies/local.js:24:23

这是local.js,用于检查用户名和密码是否正确。

var passport = require('passport'),
LocalStrategy = require('passport-local').Strategy,
User = require('mongoose').model('User');

module.exports = function () {
passport.use(new LocalStrategy(function (username, password, done) {
    User.findOne({
        username: username
    }, function (err, user) {
        if (err) {
           return done(err);
        }
        if (!user) {
            return done(null, false, {
                message: 'Invalid Username or Password'
            });
        }
        if (!user.authenticate(password)) {
            return done(null, false, {
                message: 'Invalid Username or Password'
            });
        }
        return done(null, user);
    });
 }));
};

这是控制器中的signin方法。

exports.signin = function (req, res, next) {
passport.authenticate('local', function (err, user, info) {
   if (err || !user) {
       res.send(info);
   } else {
       res.json({
           status: 'true',
           message: 'Logged In'
       });
   }
 })(req, res, next);
};

我是通过邮递员发送请求的。如果用户名无效,我会收到正确的回复,但如果密码无效,则会引发错误。我不知道什么是错的。请帮忙。

3 个答案:

答案 0 :(得分:2)

您的Mongoose模型没有身份验证方法,但您可以将其添加到架构中。

示例代码:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;


var UserSchema = new Schema ({
  ...
});


UserSchema.methods.authenticate = function(password) {
  //implementation code goes here
}

mongoose.model('User', UserSchema);
module.exports = mongoose.model('User');

或者您可以使用Mongoose passport plugin

答案 1 :(得分:1)

我得到了同样的错误。在我的情况下,我忘记添加userSchema.plugin(passportLocalMongoose);并且不要忘记npm install  passport-local-mongoose包。我希望这能帮到您。感谢

答案 2 :(得分:0)

就像“ Hya”所说的

您的Mongoose模型没有验证方法,但是您可以将其添加到架构中。

示例代码:

var mongoose = require('mongoose'),
    Schema = mongoose.Schema;


var UserSchema = new Schema ({
  ...
});

// function should be like this to match encrypted password 
UserSchema.methods.authenticate = function(password) {      
  return this.password === this.hashPassword(password);
}
                ## OR ##

// if you are not using any encryption in password code then function should be like this 
UserSchema.methods.authenticate = function(password) {      
  return this.password === password;
}


mongoose.model('User', UserSchema);
module.exports = mongoose.model('User');