2017-02-21 4 views
-1
Defined

Ja, ich sehe, dass diese Frage here und here gefragt wurde, aber die Antworten verweisen auf entweder Änderungen an Ihren deserializeUser Rückruf machen, oder etwas in Ihrem Mongoose Modell zu ändern.PassportJS: Benutzer ist nicht

Ich habe die erste ohne Erfolg versucht und verwende den normalen alten NodeJS-Treiber, also bin ich mir nicht ganz sicher, wo ich die Ursache meines Problems lokalisieren soll.

Hier ist mein Skript:

AUTHENTICATE.JS:

var app = require('express'); 
var router = app.Router(); 
var assert = require('assert'); 
var bcrypt = require('bcrypt'); 
var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

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(new LocalStrategy({ 
    usernameField: 'email', 
    passwordField: 'password' 
}, 
    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); 
    }); 
    } 
)); 

router.post('/login', 
    passport.authenticate('local', {successRedirect:'/', 
    failureRedirect:'/login',failureFlash: false}), 
     function(req, res) { 
     res.redirect('/'); 
}); 

Für meine app.js Datei ich eine Reihe der vorgeschlagenen Korrekturen in ähnliche Fragen versucht haben, aber nichts einen Unterschied gemacht hat. Dies ist, wie es aussieht:

APP.JS:

var express = require('express'); 
var app = express(); 
var bodyParser = require('body-parser'); 
var cookieParser = require('cookie-parser'); 
var expressValidator = require('express-validator'); 
var passport = require('passport'); 
var localStrategy = require('passport-local').Strategy; 
var mongo = require('mongodb').MongoClient; 
var session = require('express-session'); 
var bcrypt = require('bcrypt'); 

// Express Session 
app.use(session({ 
    secret: 'keyboard cat', 
    saveUninitialized: true, 
    resave: true, 
    cookie: {secure: true} 
})); 


app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 

//initialize passport for app 
app.use(passport.initialize()); 
app.use(passport.session()); 

// make mongodb available to the application 
app.use((req, res, next) => { 
    mongo.connect('mongodb://localhost:27017/formulas', (e, db) => { 
    if (e) return next(e); 
    req.db = db; 
    next(); 
    }); 
}); 

app.set('view engine', 'ejs'); 
app.set('views', __dirname + '/views'); 
app.use(express.static(__dirname + '/public')); 

// Express Validator 
app.use(expressValidator({ 
    errorFormatter: function(param, msg, value) { 
     var namespace = param.split('.') 
     , root = namespace.shift() 
     , formParam = root; 

    while(namespace.length) { 
     formParam += '[' + namespace.shift() + ']'; 
    } 
    return { 
     param : formParam, 
     msg : msg, 
     value : value 
    }; 
    } 
    })); 

//define routes here 


app.set('port', (process.env.PORT || 3000)); 

app.listen(app.get('port'), function(){ 
    console.log("The server is now listening on port "+app.get('port')); 
}); 

module.exports = app; 

Jede Hilfe wäre sehr dankbar, danke.

+0

Hat das für Sie funktioniert? Brauchst du noch Hilfe? – Josh

+0

Vielen Dank für Ihre Antwort, und ich entschuldige mich für die verspätete Antwort, aber im Moment bin ich immer noch dabei. Ich verstehe, wie Mongoose Ihnen erlaubt, Schemas zu erstellen, und Sie können eins für einen Benutzer verwenden und dann das in 'deserializeUser' verwenden, aber ich bin nicht sicher, wie das andere Beispiel dazu in Beziehung steht, weil die' User' Klasse nie definiert ist. Im Moment werde ich wahrscheinlich einfach mein eigenes 'User'-Objekt erstellen und sehen, wie das geht. –

Antwort

1

Da beide Fragen auf Sie hinweisen, müssen Sie zuerst die Klasse User definieren, bevor Sie sie verwenden können. Es ist nicht etwas, was Passjs oder Expressjs zur Verfügung stellen, Sie müssen es für sich selbst implementieren oder ein anderes Modul verwenden, das Ihnen diese Funktionalität gibt (wie Mungo).

  • Im ersten SO verknüpfen Sie die Antwort teilte der OP ein Benutzermodell (User) in Mungo implementieren vorgeschlagen (es scheint eine beliebte Wahl zu sein).
  • Die zweiten Links beantworten vereinfachte Dinge ein wenig, indem sie ein fest codiertes Objekt hinzufügen, das den Benutzer in der deserializer-Funktion darstellt.
Verwandte Themen