【问题标题】:passport.js Error: Failed to serialize user into sessionpassport.js 错误:无法将用户序列化到会话中
【发布时间】:2021-04-06 17:32:03
【问题描述】:

我在这里使用 Nodejs Mongoose 但是当我尝试替换 Callback 以承诺时它给了我一个错误(无法将用户序列化到会话中)我该怎么办?

我正在使用 passport.serializeUser 和 passport.deserializeUser 但它给出了这个错误

    const passport = require('passport');
const DiscordStrategy = require('passport-discord');
const User = require('../database/schemas/User');

passport.serializeUser((user, done) => {
    done(null, user.discordid)
})

passport.deserializeUser(async (discordId, done) => {
    try {
        const user = await User.findOne({discordId});
        return user ? done(null, user): done(null, null);
    } catch (err) {
        console.log(err)
        done(err, null)
    }
});

passport.use(new DiscordStrategy({
    clientID: process.env.DASBOARD_CLIENT_ID,
    clientSecret: process.env.DASBOARD_CLIENT_SECRET,
    callbackUrl: process.env.DASBOARD_CALLBACK_URL,
    scope: ['identify','guilds'],
}, async (accessToken, refreshToken, profile, done) => {
    const {id, username, discriminator, avatar, guilds} = profile;
    try{
        const findUser = await User.findOneAndUpdate(
            { discordId: id }, 
            {
            discordTag: `${username}#${discriminator}`,
            avatar,
            guilds,
        }, 
        {new: true});
        if ( findUser ) {
            console.log('++')
            return done(null, findUser);
        } else {
            const newUser = await User.create({
                discordId: id,
                discordTag: `${username}#${discriminator}`,
                avatar,
                guilds,
            })
            return done(null, newUser)
        }
    } catch(err){
        console.log(err);
        return done(err, null)
    }
})
);

++

Error: Failed to serialize user into session
    at pass (C:\Users\pilat\Desktop\makrel beta 2\backend\node_modules\passport\
lib\authenticator.js:281:19)
    at serialized (C:\Users\pilat\Desktop\makrel beta 2\backend\node_modules\pas
sport\lib\authenticator.js:286:7)
    at C:\Users\pilat\Desktop\makrel beta 2\backend\src\strategies\discord.js:6:
5
    at pass (C:\Users\pilat\Desktop\makrel beta 2\backend\node_modules\passport\
lib\authenticator.js:294:9)
    at Authenticator.serializeUser (C:\Users\pilat\Desktop\makrel beta 2\backend
\node_modules\passport\lib\authenticator.js:299:5)
    at SessionManager.logIn (C:\Users\pilat\Desktop\makrel beta 2\backend\node_m
odules\passport\lib\sessionmanager.js:14:8)
    at IncomingMessage.req.login.req.logIn (C:\Users\pilat\Desktop\makrel beta 2
\backend\node_modules\passport\lib\http\request.js:50:33)
    at Strategy.strategy.success (C:\Users\pilat\Desktop\makrel beta 2\backend\n
ode_modules\passport\lib\middleware\authenticate.js:253:13)
    at verified (C:\Users\pilat\Desktop\makrel beta 2\backend\node_modules\passp
ort-oauth2\lib\strategy.js:186:20)
    at Strategy._verify (C:\Users\pilat\Desktop\makrel beta 2\backend\src\strate
gies\discord.js:37:20)
    at processTicksAndRejections (internal/process/task_queues.js:93:5)

这是给控制台的错误。我该怎么办?

【问题讨论】:

    标签: node.js mongodb passport.js


    【解决方案1】:

    据此https://mongoosejs.com/docs/promises.html#built-in-promises

    如果你要使用async/await,你需要添加.exec()

    const user = await User.findOne({discordId}).exec();
    
    const findUser = await User.findOneAndUpdate(
        { discordId: id }, 
        {
            discordTag: `${username}#${discriminator}`,
            avatar,
            guilds,
        }, 
        {new: true}).exec();
    
    const newUser = await User.create({
        discordId: id,
        discordTag: `${username}#${discriminator}`,
        avatar,
        guilds,
    }).exec();
    

    【讨论】:

    • @ErenByxlarge 您能否将这个console.log(err) 的整个打印日志添加到问题中?
    • 终于解决了我犯了一个字符错误非常感谢你
    猜你喜欢
    • 2013-11-25
    • 2018-10-22
    • 2021-03-14
    • 2020-02-04
    • 2019-03-26
    • 1970-01-01
    • 2013-02-27
    • 2021-12-14
    • 2012-09-19
    相关资源
    最近更新 更多