为什么 {{user.username}} 在把手中不起作用

Why doesn't {{user.username}} work in handlebars

我在使用车把方面需要帮助。我正在尝试使用 {{user.username}} 将用户名插入我的 index.hbs。问题是它向我展示了这个:

Handlebars: Access has been denied to resolve the property "username" because it is not an "own property" of its parent.

const express = require('express');
const path = require('path');
const exphbs = require('express-handlebars');
const methodOverride = require('method-override');
const session = require('express-session');
const flash = require('connect-flash');
const passport = require('passport');

const app = express();
require('./database');
require('./config/passport');

//Configuracion
app.set('port', process.env.PORT || 3000);
app.set('views', path.join(__dirname, 'views'));

app.engine('.hbs', exphbs({
    defaultLayout: 'main',
    layoutsDir: path.join(app.get('views'), 'layouts'),
    partialsDir: path.join(app.get('views'), 'partials'),
    extname: '.hbs'    
}));

app.set('view engine', '.hbs');

//Middlewares
app.use(express.urlencoded({extended: false}));
app.use(methodOverride('_method'));
app.use(session({
    secret: 'clavesecreta',
    resave: true,
    saveUninitialized: true
}));
app.use(passport.initialize());
app.use(passport.session());

app.use(flash());

//Variables
app.use((req, res, next) => {
    res.locals.success_msg = req.flash('success_msg');
    res.locals.error_msg = req.flash('error_msg');
    res.locals.error = req.flash('error');
    res.locals.user = req.user || null;
    next();
});

//Routes
app.use(require('./routes/index'));
app.use(require('./routes/videos'));
app.use(require('./routes/users'));

//Archivos estaticos
app.use(express.static(path.join(__dirname, 'public')));

//Iniciar server
app.listen(app.get('port'), () => {
    console.log('El servidor esta escuchando en el puerto', app.get('port'))
});

这是我得到 user.username 的地方。我还插入了我的 user.js 模型:

const mongoose = require('mongoose');
const { Schema } = mongoose;
const bcrypt = require('bcryptjs');

const UserSchema = new Schema({
    username: { type: String, required: true},
    email: { type: String, required: true},
    password: {type: String, required: true},
    date: {type: Date, default: Date.now}
});

UserSchema.methods.encryptPassword = async (password) => {
    const salt = await bcrypt.genSalt(10);
    const hash = bcrypt.hash(password, salt);
    return hash;
};

UserSchema.methods.matchPassword = async function (password){
    return await bcrypt.compare(password, this.password);
};

module.exports = mongoose.model('User', UserSchema)

我通过删除 app.js 中间件中的 res.locals.user 并将其移至 userAuthenticated 函数解决了这个问题。并在 req.user 之后添加 .toJSON() 以对其进行序列化。

这是我的 userAuthenticated 函数的示例代码:

module.exports.userAuthenticated = function (req, res, next) {
    if (req.isAuthenticated()) {
        res.locals.user = req.user.toJSON() || null;
        return next();
    }
    res.redirect('/');
},