Erreur: impossible de sérialiser l’utilisateur dans la session

salut eu un problème avec le module de passeport et exprimer.

Ceci est mon code et je veux juste utiliser un identifiant pour le premier essai.

Je reçois toujours le message:

J’ai cherché beaucoup et trouvé des articles dans stackoverflow mais je n’ai pas eu l’échec.

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

Mon code ressemble à ceci.

 'use ssortingct'; 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'); }(); 

On dirait que vous n’avez pas implémenté passport.serializeUser et passport.deserializeUser . Essayez d’append ceci:

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

Si vous décidez de ne pas utiliser les sessions, vous pouvez définir la session sur false.

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

On dirait que vous avez manqué une partie de la configuration de passportjs, en particulier ces deux méthodes:

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

J’ai ajouté le bit à propos de ._id vs. .id mais cet extrait provient de la section Configure de docs, donnez-lui une autre lecture et bonne chance 🙂

Voici un moyen de travailler mais toujours paresseux pour utiliser des sessions et toujours “sérialiser” les valeurs.

 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]); }); 

Dans le cas où des erreurs étranges se poseraient, posez-vous simplement la question suivante: “Est-ce que je règle vraiment ‘_id’ dans mon object utilisateur?” – Dans la plupart des cas, vous ne le faites pas. Donc, utilisez un atsortingbut approprié comme clé.

Utiliser Promise avec serializeUser & deserializeUser:

 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}`); }); }); 

S’il vous plaît voir mon repo github pour un exemple de code complet comment résoudre ce problème.