2017-02-21 45 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函數中添加一個硬編碼對象來表示用戶來回答簡化的事情。