2017-02-21 41 views
-1

是的,我看到这个问题已被问到herehere,但答案指向或者更改您的deserializeUser回调,或者更改您的Mongoose模型中的某些内容。PassportJS:用户未定义

我试过了第一个无济于事,并且使用了常规的ol'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'类从未定义过。目前,我可能只是要创建自己的'用户'对象,看看如何。 –

回答

1

由于您提到的两个问题都指出,您需要首先定义User类,然后才能使用它。这不是passportjs或expressjs提供的东西,你需要为自己实现它,或者使用另一个为你提供该功能的模块(如mongoose)。

  • 在第一SO链接你共享的回答表明了OP实施猫鼬用户模型(User)(这似乎是一个普遍的选择)。
  • 第二个链接通过在deserializer函数中添加一个硬编码对象来表示用户来回答简化的事情。