2017-02-21 10 views
-1

Да, я вижу, что этот вопрос задан here и here, но ответы указывают либо на внесение изменений в ваш обратный вызов deserializeUser, либо изменение чего-то в вашей модели Mongoose.PassportJS: Пользователь не определен

Я пробовал первый безрезультатно и использую обычный драйвер NodeJS, поэтому я не совсем уверен, где определить первопричину моей проблемы.

Вот мой сценарий:

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('/'); 
}); 

Для моего app.js файла я пытался несколько исправлений, предложенных в подобных вопросах, но ничего не сделал разницу. Это то, что он выглядит следующим образом:

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; 

Любая помощь будет принята с благодарностью, спасибо.

+0

Это работало для вас? Вам все еще нужна помощь? – Josh

+0

Спасибо за ваш ответ, и я приношу свои извинения за задержанный ответ, но на данный момент я все еще разбираюсь в этом. Я понимаю, как Mongoose позволяет создавать схемы, и вы можете использовать его для пользователя, а затем использовать его в 'deserializeUser', но я не уверен, как другой пример относится к этому, потому что класс' User' никогда не определяется. На данный момент я, вероятно, просто собираюсь создать свой собственный объект User и посмотреть, как это происходит. –

ответ

1

В качестве обоих вопросов, которые вы указали, необходимо указать класс User, прежде чем вы сможете его использовать. Это не то, что предоставляют паспорта или выражения, вам нужно реализовать его для себя или использовать другой модуль, который дает вам эту функциональность (например, мангуста).

  • В первую SO ссылку вы поделились ответ предложил О.П. реализовать модель пользователя (User) в мангуста (это, кажется, популярный выбор).
  • Вторые ссылки немного упрощают ситуацию, добавляя жестко закодированный объект для представления пользователя в функции deserializer.