为啥 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 中不起作用