Node.js环境下Handlebars属性访问被拒绝报错如何解决
报错说明
Handlebars: Access has been denied to resolve the property "status" because it is not an "own property" of its parent.
You can add a runtime option to disable the check or this warning:
该报错是新版Handlebars为了防范原型污染漏洞,默认禁止访问对象原型链上的属性导致的,你配置的参数未生效是因为写法存在错误。
现有配置的错误点
- 参数位置错误:
express-handlebars的初始化方法仅接收一个配置对象,你将allowProtoPropertiesByDefault等安全配置拆成第二个独立参数传入,这些参数完全没有被引擎识别。 - 拼写错误:配置项
defaultLayout被误写为deafultLayout,会导致后续默认布局加载失败。
正确修复方案
方案1:修正全局配置(快速解决)
将安全选项合并到同一个配置对象中即可,正确代码如下:
var hbs = require('express-handlebars'); app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'hbs'); app.engine('hbs', hbs({ extname: 'hbs', defaultLayout: 'layout', layoutsDir: __dirname + '/views/layouts/', partialsDir: __dirname + '/views/partials', // 安全配置直接写到同一个配置对象内 allowProtoMethodsByDefault: true, allowProtoPropertiesByDefault: true }));
方案2:局部转换数据(安全性更高)
全局开放原型属性访问存在一定安全风险,如果你是因为传递了ORM实例(比如Mongoose、Sequelize的查询结果)到模板导致报错,可以只将对应数据转换为普通对象即可解决问题:
// Mongoose场景示例 const user = await User.findById(id).lean() // 直接用lean()返回普通对象 // 或 const user = (await User.findById(id)).toObject() res.render('user', { user })
内容的提问来源于stack exchange,提问作者VIPIN PV
相关产品推荐
相关产品推荐

