【问题标题】:Node.js Express Passport.js - Data won't serializeNode.js Express Passport.js - 数据不会序列化
【发布时间】:2013-10-24 15:43:14
【问题描述】:
/**
* 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()) 它?

你知道问题是什么吗?这是堆栈跟踪。 (为了安全起见,我将项目名称的所有副本都更改为“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)

【问题讨论】:

    标签: javascript node.js express passport.js


    【解决方案1】:

    我认为您缺少建立登录会话所需的 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(new LocalStrategy(...

    还可以查看这个相关问题:Node.js user authentication using passport

    【讨论】:

    • 现在已经解决了,没想到我居然要把每条数据都放进去而不是对象!
    猜你喜欢
    • 1970-01-01
    • 2019-04-20
    • 2019-06-27
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2014-10-10
    • 2018-02-04
    • 2018-05-22
    相关资源
    最近更新 更多