错误:无法将用户序列化到会话中

嗨护照模块有问题,并表示。

这是我的代码,我只想使用硬编码的login进行第一次尝试。

我总是得到这个消息:

我search了很多,发现了一些post在stackoverflow,但我没有得到失败。

Error: failed to serialize user into session at pass (c:\Development\private\aortmann\bootstrap_blog\node_modules\passport\lib\passport\index.js:275:19)

我的代码看起来像这样。

 'use strict'; var express = require('express'); var path = require('path'); var fs = require('fs'); var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var nodemailer = require('nodemailer'); var app = express(); module.exports = function setupBlog(mailTransport, database){ var config = JSON.parse(fs.readFileSync('./blog.config')); app.set('view options', {layout: false}); app.use(express.static(path.join(__dirname, '../', 'resources', 'html'))); app.use(express.bodyParser()); app.use(express.cookieParser()); app.use(express.session({ secret: 'secret' })); app.use(passport.initialize()); app.use(passport.session()); app.get('/blog/:blogTitle', function(req, res) { var blogTitle = req.params.blogTitle; if(blogTitle === 'newest'){ database.getLatestBlogPost(function(post) { res.send(post); }); } else { database.getBlogPostByTitle(blogTitle, function(blogPost) { res.send(blogPost); }); } }); passport.use(new LocalStrategy(function(username, password, done) { // database.login(username, password, done); if (username === 'admin' && password === 'admin') { console.log('in'); done(null, { username: username }); } else { done(null, false); } })); app.post('/login', passport.authenticate('local', { successRedirect: '/accessed', failureRedirect: '/access' })); app.listen(8080); console.log('Blog is running on port 8080'); }(); 

看起来你没有实现passport.serializeUserpassport.deserializeUser 。 尝试添加这个:

 passport.serializeUser(function(user, done) { done(null, user); }); passport.deserializeUser(function(user, done) { done(null, user); }); 

如果您决定不使用会话,则可以将会话设置为false

 app.post('/login', passport.authenticate('local', { successRedirect: '/accessed', failureRedirect: '/access', session: false })); 

听起来你错过了passportjs设置的一部分,特别是这两个方法:

 passport.serializeUser(function(user, done) { done(null, user._id); // if you use Model.id as your idAttribute maybe you'd want // done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); 

我添加了一点关于._id.id但这个片段是从文档的configuration部分 ,给另一个阅读和祝你好运:)

这里有一个工作但仍然懒惰的方式来使用会议,并仍然“串行化”的价值观。

 var user_cache = {}; passport.serializeUser(function(user, next) { let id = user._id; user_cache[id] = user; next(null, id); }); passport.deserializeUser(function(id, next) { next(null, user_cache[id]); }); 

万一或奇怪的错误只是问自己:“我是否在我的用户对象中设置'_id'? – 在大多数情况下,你不会。 所以使用适当的属性作为关键。

在serializeUser&deserializeUser中使用Promise:

 passport.serializeUser((user, done) => { done(null, user.id); }); passport.deserializeUser((id, done) => { // console.log(`id: ${id}`); User.findById(id) .then((user) => { done(null, user); }) .catch((error) => { console.log(`Error: ${error}`); }); }); 

请参阅我的github回购一个完整的代码示例如何解决这个问题。