【发布时间】:2020-05-02 07:44:28
【问题描述】:
我正在使用 Express-Handlebars 模板引擎处理 NodeJS 和 Express。
Handlebars 在尝试渲染模板时抛出以下错误:
Handlebars:访问已被拒绝解析属性“用户名” 因为它不是其父级的“自己的财产”。您可以添加一个 禁用检查或此警告的运行时选项:请参阅 https://handlebarsjs.com/api-reference/runtime-options.html#options-to-control-prototype-access 了解详情
根据上面的链接:
从 4.6.0 版本开始,Handlebars 默认禁止访问上下文对象的原型属性和方法。原因是这种可能性引起的各种安全问题。
我的 app.js 包含以下内容:
const exphbs = require('express-handlebars');
const express = require('express');
// Init Express
const app = express();
// VIEW ENGINE
app.engine('handlebars', exphbs({
defaultLayout: 'main'
}));
app.set('view engine', 'handlebars');
我的路由文件通过 Mongoose 从 MongoDB 获取:
//@GET - View
router.get('/', authMiddleware, (req, res, next) => {
// Mongoose
Model.find({ user: req.user._id })
.sort({ date: -1 })
.then(model => {
res.render('/overview', { model: model })
})
.catch(err => {
if (err) throw err;
req.flash('error_msg', 'No Model Found');
})
})
模型是一个对象数组
这个问题是在我开始添加车把助手之后才开始发生的。我已经删除了帮助程序并恢复到我原来的配置设置(上图),但无济于事。我试过删除 node_modules 文件夹并重新安装 npm。
发送的是对象数组,我正在尝试使用 {{#each model}} 帮助器循环对象的属性,并通过每个对象中的 {{prop1}} 引用各个属性。
根据 Handlebars 的说法,禁用 proto 属性默认为 false,此更改不应破坏任何内容。
我的问题:
- 我是否错误地将数据发送到车把?如果是这样,将数据发送到 express-handlebars 模板进行渲染的正确方法是什么(不让我的服务器暴露于安全漏洞)?
提前谢谢你。
【问题讨论】:
-
尝试通过这样做从其上下文对象属性中剥离数据;
model = model.toJSON(); -
嗨,Mas,感谢您的建议。 toJSON() 的文档说这是一个日期,所以这不起作用。
-
正确!我曾经使用 Sequelize,
toJSON()成功了。如果您已经尝试过但没有成功,我认为使用 lean 可以在 Mongoose 中实现相同的结果 -
精益工作!太棒了,比kyou Mas!
标签: node.js express mongoose server-side-rendering express-handlebars