我正在做一个卑鄙的堆栈应用程序,现在我正在注册并登录身份验证。但我有两个错误! 如果我有" passReqToCallback:true"它给了我"完成不是一个功能"但是当我发表评论时它很好。但我不需要吗?
之后它告诉我断言不是一个函数,然后我试着用check来切换它,它给了我检查不是一个函数。 我很困惑为什么它会给出这些错误
var passport = require('passport');
var User = require('../models/User');
var LocalStrategy = require('passport-local').Strategy;
var validator = require('express-validator');
passport.serializeUser(function(user , done ){
done(null, user.id);
});
passport.deserializeUser(function(id, done){
User.findById(id,function(err, user){
done(err, user);
});
});
passport.use('local.register', new LocalStrategy({
usernameField: 'username',
emailField: 'email',
passwordField: 'password',
passReqToCallback : true
}, function(req, username, email, password, done){
req.assert('username', 'Invalid username').notEmpty();
req.assert('email', 'Invalid email').notEmpty().isEmail();
req.assert('password', 'Invalid password').notEmpty().isLength({min: 4});
var errors = req.validationErrors();
if(errors){
var messages = [];
errors.forEach(function(error){
messages.push(error.msg);
});
return done(null, false, req.flash('error', messages));
}
User.findOne({'username':username}, function(err, user){
if(err){
return done(err);
}
if(user){
return done(null, false, {message:'Username is already use'});
}
var newUser = new User();
newUser.username = username;
newUser.email = email;
newUser.password = newUser.encryptPassword(password);
newUser.save(function(err, result) {
if (err) {
return done(err);
}
return done(null , newUser);
});
});
}));
passport.use('local.sign-in', new LocalStrategy({
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true
}, function(req, username, password, done){
req.assert('username', 'Invalid username').notEmpty();
req.assert('password', 'Invalid password').notEmpty();
var errors = req.validationErrors();
if(errors){
var messages = [];
errors.forEach(function(error){
messages.push(error.msg);
});
return done(null, false, req.flash('error', messages));
}
//find user
User.findOne({'username': username}, function(err, user){
if(err){
return done(err);
}
if(!user){
return done(null, false, {message: 'No user found.'});
}
if(!user.validPassword(password)){
return done(null, false, {message: 'Wrong password.'});
}
return done(null, user);
});
}));
答案 0 :(得分:1)
根据https://github.com/jaredhanson/passport-local#available-options,唯一选项是usernameField
和passwordField
,如果username, password, done
为passReqToCallback
,则回调仅接受false
作为参数,req, username, password, done
如果是true
。回调中的email
参数不应该存在。
为了能够使用req.assert
,您需要有权访问request
对象,因此,您需要传递passReqToCallback: true
。
它应该是这样的:
passport.use('local.register', new LocalStrategy({
usernameField: 'username',
passwordField: 'password',
passReqToCallback : true
}, function(req, username, password, done) {
req.assert ...
});
这可以解决你的两个问题。