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
方法。
尝试使用有效帐户登录时出现以下错误
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
方法。