为啥 user.username 在车把中不起作用

Posted

技术标签:

【中文标题】为啥 user.username 在车把中不起作用【英文标题】:Why doesn't user.username work in handlebars为什么 user.username 在车把中不起作用 【发布时间】:2021-06-19 14:25:35 【问题描述】:

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

Handlebars:访问已被拒绝解析属性“用户名” 因为它不是其父级的“自己的财产”。

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)

【问题讨论】:

大概req.user不是一个普通的对象,但是没有minimal reproducible example就很难说它是从哪里来的。 我刚刚更新了我所有的 index.js,对此我很抱歉,但我是新手。在我的 hbs 我只插入 user.username 这能回答你的问题吗? Handlebars: Access has been denied to resolve the property "from" because it is not an "own property" of its parent 好吧,我以前研究过这个,我解决了我的代码上的很多问题。问题是我不能在 res.locals.user = req.user || 中放置一个 .lean()空值;所以我不知道该怎么办 【参考方案1】:

我通过删除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('/');
,

【讨论】:

以上是关于为啥 user.username 在车把中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥 IOCP 在 BeginExecuteReader 中不起作用

为啥 heightForHeaderInSection 在 iOS 4.3 中不起作用?

为啥这个下拉菜单在 IE 中不起作用?

为啥复制功能在 setTimeout 中不起作用?

为啥进入动画在新线程中不起作用?

为啥自动完成在列表视图中不起作用