2013-10-24 35 views
1
/** 
* Module dependencies. 
*/ 

var express = require('express'); 
var routes = require('./routes'); 
var login = require('./routes/login'); 
var register = require('./routes/register'); 
var http = require('http'); 
var path = require('path'); 
var MongoClient = require('mongodb'); 

var passport = require('passport'); 
var LocalStrategy = require('passport-local').Strategy; 

var app = express(); 




// all environments 
app.set('port', process.env.PORT || 3001); 
app.set('views', path.join(__dirname, 'views')); 
app.set('view engine', 'jade'); 
app.use(express.favicon()); 
app.use(express.logger('dev')); 
app.use(express.bodyParser()); 
app.use(express.methodOverride()); 

app.use(express.static(path.join(__dirname, 'public'))); 

app.use(express.cookieParser()); 
app.use(express.session({secret: '1234567890QWERTY'})); 

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

app.use(app.router); 

var dbc; 
MongoClient.connect('mongodb://127.0.0.1:27017/mydb', function(err, db) { 
    dbc = db; 
}); 



passport.use(new LocalStrategy(
function(username, password, done) { 
    var User = dbc.collection('users'); 
    User.findOne({ name: /^Harry Torry$/i }, function(err, user) { 

     console.log(JSON.stringify(user)); 
     if(!err) done(null, JSON.stringify(user)); 
     else done(err, null) 
    }); 
} 
)); 

// development only 
if ('development' == app.get('env')) { 
app.use(express.errorHandler()); 
} 

app.get('/', routes.index); 



// User stuff 
app.get('/login', login.get); 
app.post('/login', 
passport.authenticate('local', { successRedirect: '/', 
           failureRedirect: '/login' 
          }) 
); 
app.get('/register', register.get); 
app.post('/register', register.post); 



http.createServer(app).listen(app.get('port'), function(){ 
console.log('Express server listening on port ' + app.get('port')); 
}); 

所以這裏是我的代碼。由於某種原因,每當我嘗試登錄它說它不能序列化數據,即使我可以console.log(json.stringify())它?Node.js Express Passport.js - 數據不會序列化

有什麼想法是什麼問題?這是堆棧跟蹤。 (爲了安全起見,我用「mydb」更改了項目名稱的所有副本)。

{"name":"harry torry","registed":"2013-10-23T15:14:27.504Z","_id":"5267e7d3f03965eb2c000001"} 
Error: failed to serialize user into session 
    at pass (/usr/local/lib/node_modules/passport/lib/passport/index.js:275:19) 
    at Passport.serializeUser (/usr/local/lib/node_modules/passport/lib/passport/index.js:283:5) 
    at IncomingMessage.req.login.req.logIn (/mnt/apshared/mydb/website/node_modules/passport-local/node_modules/passport/lib/passport/http/request.js:43:29) 
    at Context.delegate.success (/usr/local/lib/node_modules/passport/lib/passport/middleware/authenticate.js:194:13) 
    at Context.actions.success (/usr/local/lib/node_modules/passport/lib/passport/context/http/actions.js:21:25) 
    at verified (/mnt/apshared/mydb/website/node_modules/passport-local/lib/passport-local/strategy.js:83:10) 
    at /mnt/apshared/mydb/website/app.js:54:18 
    at /mnt/apshared/mydb/website/node_modules/mongodb/lib/mongodb/collection.js:953:5 
    at Cursor.nextObject (/mnt/apshared/mydb/website/node_modules/mongodb/lib/mongodb/cursor.js:678:5) 
    at commandHandler (/mnt/apshared/mydb/website/node_modules/mongodb/lib/mongodb/cursor.js:658:14) 

回答

2

我認爲你缺少建立登錄會話所需的passport.serializeUser函數。從passport docs

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之前添加這些代碼行(新LocalStrategy(...

也會檢出此相關的問題:Node.js user authentication using passport

+0

它現在解決了,我沒有」要意識到我實際上不得不把每一塊數據放入對象中! –