【问题标题】: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)

【问题讨论】:

标签: node.js handlebars.js


【解决方案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('/');
},

【讨论】:

    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 2022-01-05
    • 2017-03-03
    • 1970-01-01
    • 2020-12-24
    • 2018-08-03
    • 2023-03-20
    • 1970-01-01
    相关资源
    最近更新 更多