2017-01-07 3 views
0

Ich versuche ein Benutzerauthentifizierungssystem in meiner Node App mit Passport.js zu erstellen. Wenn ich versuche, mich als neuer Benutzer anzumelden, scheint es gut zu funktionieren. Aber wenn ich versuche, in der Anmeldung gibt der Eingabeaufforderung mir dies:Getting throw er; // Nicht behandeltes "Fehler" -Ereignis für Node & Passport

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) 

Hier ist meine passport.js Datei:

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); 
    }); 
} 
)); 

Und hier ist meine server.js Datei:

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); 

Ich habe versucht, meinen node_modules-Ordner zu löschen und npm install auszuführen, aber dieser Fehler taucht immer noch auf. Was mache ich falsch?

Antwort

0

Da Sie die passReqToCallback Option true im LocalStrategy Konstruktor setzen, wird Ihre Callback-Funktion mit diesen Argumenten aufgerufen: (req, username, password, done), aber Ihre Funktion (username, password, done) akzeptiert, weshalb die Argumente an die falschen Parameter zugeordnet werden immer (und also warum done ist keine funktion wie die fehlermeldung sagt). Um dies zu beheben, versuchen Sie die passReqToCallback Option zu entfernen, wie folgt aus:

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); 
    }); 
})); 

Oder, wenn Sie später entscheiden, dass Sie die req in Ihrem LocalStrategy benötigen, dann fügen Sie den Parameter an die Funktion, wie folgt aus:

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); 
    }); 
} 
)); 
+0

Das hat es behoben. Ich danke dir sehr! –

Verwandte Themen