passport.js Error: Failed to serialize user into session

passport.js Error: Failed to serialize user into session

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

我正在使用 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)

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

根据这里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();