TypeError:done不是函数,TypeError:断言不是函数

时间:2017-03-23 00:28:21

标签: mongodb authentication express passport.js

我正在做一个卑鄙的堆栈应用程序,现在我正在注册并登录身份验证。但我有两个错误! 如果我有" 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);
    });

     }));

1 个答案:

答案 0 :(得分:1)

根据https://github.com/jaredhanson/passport-local#available-options,唯一选项是usernameFieldpasswordField,如果username, password, donepassReqToCallback,则回调仅接受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 ...
});

这可以解决你的两个问题。