2017-01-07 12 views
0

Passport.jsを使用したノードアプリケーションにユーザー認証システムを構築しようとしています。新しいユーザーとしてサインアップしようとすると、正常に動作しているようです。私がログインしようとする。しかし、コマンドプロンプトは私にこれを与える:スローを取得する。 //ノード&パスポートの未処理の 'エラー'イベント

var express = require('express'); 
var app = express(); 
var port = process.env.PORT || 8080; 
var mongoose = require('mongoose'); 
var passport = require('passport'); 
var morgan = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var session = require('express-session'); 
var flash = require('connect-flash'); 
var db = require('./config/database.js'); 
var favicon = require('serve-favicon'); 

app.use(favicon(__dirname + '/public/imgs/favicon.ico')); 

mongoose.Promise = global.Promise; 

mongoose.connect(db.url); 
require('./config/passport'); 

app.use(morgan('dev')); 
app.use(cookieParser()); 
app.use(bodyParser.urlencoded({ extended: true })); 
app.use(bodyParser.json()); 

app.set('view engine', 'ejs'); 

app.use(session({ secret: 'penniesfromheaven', resave: true, saveUninitialized: true })); 
app.use(passport.initialize()); 
app.use(passport.session()); 
app.use(flash()); 

app.use(express.static(__dirname + '/public')); 

require('./app/routes.js')(app, passport); 

app.listen(port); 
console.log('The magic happens on port ' + port); 

var passport = require('passport'), LocalStrategy = require('passport-local').Strategy; 

var User = require('../app/models/user'); 

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-signup', new LocalStrategy({ 

    passReqToCallback : true 
}, 

    function(req, email, password, done) { 

     process.nextTick(function() { 

      User.findOne({ 'local.email' : email}, function(err, user) { 
       if (err) 
        return done(err); 

       if (user) { 
        return done(null, false, req.flash('signupMessage', 'That email is already taken.')); 
       } else { 

        var newUser = new User(); 

        newUser.local.email = email; 
        newUser.local.password = newUser.generateHash(password); 

        newUser.save(function(err) { 
         if (err) 
          throw err; 
         return done(null, newUser); 
        }); 
       } 
      }); 
     }); 
})); 

passport.use(new LocalStrategy({ 

    passReqToCallback : true 
}, 

function(username, password, done) { 

    User.findOne({ username: username }, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
      return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
} 
)); 

そして、ここでは私のserver.jsファイルです:

throw er; // Unhandled 'error' event 
^

TypeError: done is not a function 
    at C:\spectray\config\passport.js:55:22 
    at C:\spectray\node_modules\mongoose\lib\model.js:3419:16 
    at C:\spectray\node_modules\kareem\index.js:212:48 
    at C:\spectray\node_modules\kareem\index.js:127:16 
    at _combinedTickCallback (internal/process/next_tick.js:67:7) 
    at process._tickCallback (internal/process/next_tick.js:98:9) 

ここに私のpassport.jsファイルですnode_modulesフォルダを削除してnpm installを実行しようとしましたが、このエラーはまだ表示されます。私は間違って何をしていますか?

答えて

0

あなたはLocalStrategyコンストラクタでtruepassReqToCallbackオプションを設定しているので、あなたのコールバック関数は、これらの引数で呼び出されます:(req, username, password, done)が、あなたの関数は、引数が間違ったパラメータに割り当てられ得ている理由である、(username, password, done)を受け入れている(としたがって、なぜdoneはエラーメッセージのように機能しません)。

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: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
      return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
})); 

それとも、あなたがあなたのLocalStrategyでreqが必要であることを後で決める場合は、このように、関数にパラメータを追加します:

passport.use(new LocalStrategy({ 

    passReqToCallback : true 
}, 

function(req, username, password, done) { 

    User.findOne({ username: username }, function(err, user) { 
     if (err) { return done(err); } 
     if (!user) { 
      return done(null, false, { message: 'Incorrect username.' }); 
     } 
     if (!user.validPassword(password)) { 
      return done(null, false, { message: 'Incorrect password.' }); 
     } 
     return done(null, user); 
    }); 
} 
)); 
この問題を修正するには、このように、 passReqToCallbackオプションを削除してみてください
+0

それはそれを修正しました。どうもありがとうございます! –

関連する問題