Passport.js 登录错误

Passport.js Signin error

尝试使用有效帐户登录时出现以下错误

    if(!user.authenticate(password)){
               ^
TypeError: undefined is not a function
    at Promise.<anonymous> (/home/kj/Desktop/nodejs-exp/MEAN_BOOK/config/strategies/local.js:19:16)
    at Promise.<anonymous> (/home/kj/Desktop/nodejs-exp/MEAN_BOOK/node_modules/mongoose/node_modules/mpromise/lib/promise.js:177:8)
    at Promise.emit (events.js:107:17)
    at Promise.emit (/home/kj/Desktop/nodejs-exp/MEAN_BOOK/node_modules/mongoose/node_modules/mpromise/lib/promise.js:84:38)
    at Promise.fulfill (/home/kj/Desktop/nodejs-exp/MEAN_BOOK/node_modules/mongoose/node_modules/mpromise/lib/promise.js:97:20)
    at /home/kj/Desktop/nodejs-exp/MEAN_BOOK/node_modules/mongoose/lib/query.js:1406:13
    at model.Document.init (/home/kj/Desktop/nodejs-exp/MEAN_BOOK/node_modules/mongoose/lib/document.js:254:11)
    at completeOne (/home/kj/Desktop/nodejs-exp/MEAN_BOOK/node_modules/mongoose/lib/query.js:1404:10)
    at Immediate.cb (/home/kj/Desktop/nodejs-exp/MEAN_BOOK/node_modules/mongoose/lib/query.js:1158:11)
    at Immediate._onImmediate (/home/kj/Desktop/nodejs-exp/MEAN_BOOK/node_modules/mongoose/node_modules/mquery/lib/utils.js:137:16)
    at processImmediate [as _immediateCallback] (timers.js:367:17)

下面是我的 locals.js,它在身份验证期间被调用

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:'Unknown User'
        });
      }
      if(!user.authenticate(password)){
        return done(null,false,{
          message:'Invalid password'
        });
      }

      return done(null,user);
    });
  }));
};

还有我的 routes.js 文件

module.exports = function(app){
  app.route('/signup')
    .get(users.renderSignup)
    .post(users.signup);

  app.route('/signin')
    .get(users.renderSignin)
    .post(passport.authenticate('local',{
      successRedirect: '/',
      failureRedirect: '/signin',
      failureFlash : true
    }));

  app.get('/signout',users.signout);
};

我的用户模型:

  var UserSchema = new Schema({
    firstName: String,
    lastName : String,
    email: {
      type: String,
      match: [/.+\@.+\..+/, "Please fill a valid e-mail address"]
    },
    username : {
      type: String,
      trim: true,
      required:'Username is required',
      unique : true
    },
    password : {
      type:String,
      validate:[
        function(password){
          return password && password.length>6;
        },'Password should be longer'
      ]
    },
    sale:{
      type:String
    },
    provider:{
      type:String,
      required:'Provider is required'
    },
    providerId:String,
    providerDate:{},
    created : {
      type : Date,
      default : Date.now
    }
  });

我知道错误是什么意思。如果您需要更多信息来调试问题,请告诉我。

您的模式似乎缺少名为 authenticate()instance method。这不是自动提供的,所以你需要自己实现它。

根据您的代码判断,它可能就这么简单:

UserSchema.methods.authenticate = function(password) {
  return this.password === password;
};

你可以简单地:

 if(user.password !== password){
    return done(null,false,{
      message:'Invalid password'
    });
  }

User 模型没有 authenticate 方法。