在 Node+Express+Passport 应用程序中,res.locals.users 有效,但数据未定义

In Node+Express+Passport app, res.locals.users works, but data is undefined

我正在使用 NodeJS、Express 和 Passport 制作应用程序,但我在视图中显示用户数据时遇到问题。

我在 res.locals.user 中获得了用户的 ObjectID,但其中的数据(如姓名、电子邮件等)返回为“未定义”。例如,console.log(res.locals.user) returns "5ef5ddd2e67f9e2918e79bcb" 但 console.log(res.locals.user.name) 或 console.log(user.name ) returns“未定义”。

澄清一下: 在 EJS 中,如果我输入 <%= user %>,它会显示数据库中用户的对象 ID。如果我输入 <%= user.name %> 它不会呈现并且控制台显示“未定义”。

这是我的护照-本地-strategy.js:

const express = require('express');
const LocalStrategy = require('passport-local').Strategy;
const User = require('../models/users');

passport.use(new LocalStrategy({
    usernameField: 'email'
},
    function (email, password, done) {
        User.findOne({ email: email }, function (err, user) {
            if (err) {
                console.log('Error in finding user --> Passport');
                return done(err);
            }

            if (!user || user.password != password) {
                console.log('Invalid username or password');
                return done(null, false);
            }

            return done(null, user);
        });
    }
));

passport.serializeUser(function (user, done) {
    done(null, user.id);
});
passport.deserializeUser(function (id, done) {
    User.findById(id, function (err, user) {
        if (err) {
            console.log('Error in finding user --> Passport');
            return done(err);
        }
        return done(null, user.id);
    });
});

passport.checkAuthentication = function (req, res, next) {
    if (req.isAuthenticated()) {
        return next();
    }
    return res.redirect('/users/sign-in');
};

passport.setAuthenticatedUser = function (req, res, next) {
    if (req.isAuthenticated()) {
        res.locals.user = req.user;
        console.log(res.locals.user);
    }

    next();
}

module.exports = passport;

我通过使用异步和等待块将 res.locals.user 分配给 User.findById 来修复它。

passport.setAuthenticatedUser = async function (req, res, next) {
if (req.isAuthenticated()) {
    res.locals.user = await User.findById(req.user, function (err, user) {
        if (err) {
            console.log('Error in finding user --> Passport');
        }
        return;
    });
}

next();

}