Да, я вижу, что этот вопрос задан 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;
Любая помощь будет принята с благодарностью, спасибо.
Это работало для вас? Вам все еще нужна помощь? – Josh
Спасибо за ваш ответ, и я приношу свои извинения за задержанный ответ, но на данный момент я все еще разбираюсь в этом. Я понимаю, как Mongoose позволяет создавать схемы, и вы можете использовать его для пользователя, а затем использовать его в 'deserializeUser', но я не уверен, как другой пример относится к этому, потому что класс' User' никогда не определяется. На данный момент я, вероятно, просто собираюсь создать свой собственный объект User и посмотреть, как это происходит. –