2017-03-23 3 views
1

私は平均スタックアプリケーションを実行していますが、今は登録とサインインの認証に取り組んでいます。しかし、私は2つのエラーが発生しています! "passReqToCallback:true"を指定すると、 "doneは関数ではありません"が表示されますが、コメントアウトすると問題ありません。しかし、私はそれを必要としないのですか?TypeError:doneは関数ではありません。TypeError:関数がアサートされていません

その後、アサーションは関数ではないことがわかりました。それから私はチェックで切り換えようとしましたが、チェックは関数ではありません。 それはそれはtrueだ場合

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

なぜ 'emailField'を' LocalStrategy'に渡しますか? – luisenrike

+0

https://github.com/cecdelr/nodejs-shopping-cart私はこの登録に従っており、認証で署名しています。 – panchita911

+0

ええ、例には 'emailField'はなく、' usernameField: 'email''しかありません。 https://github.com/cecdelr/nodejs-shopping-cart/blob/master/config/passport.js#L20 – luisenrike

答えて

1

https://github.com/jaredhanson/passport-local#available-optionsによるのみのオプションはusernameFieldpasswordFieldあり、そしてpassReqToCallbackfalseであれば、コールバックが唯一の引数としてusername, password, doneを受け入れ、そしてreq, username, password, doneこれらのエラーを与えている、なぜ私はとても混乱しています。コールバック内の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 ... 
}); 

このようなものでなければなりません。

+0

大丈夫ですが、私のアプリではユーザー名の電子メールとパスワードを使用しています。どのように私は電子メールを持っていたのですか?あなたが 'username'の代わりに' email'フィールドを使い、 'usernameField'の値を' 'email'':' usernameField: 'email''に変更したいのであれば、それらは唯一のオプションです。 – panchita911

+0

これらは唯一のオプションです。 – luisenrike

+0

aww that sucksは電子メールを使用してユーザ名を作成することはできません。しかし、多くのsoooに感謝:) – panchita911

関連する問題