Express.js中MongoDB用户数据HTML显示失败,Handlebars权限报错求助
问题排查与解决
核心问题分析
你遇到的报错源于两个关键点:
- Mongoose文档属性访问限制:
User.findOne()返回的是Mongoose Document实例,而非普通JavaScript对象。Handlebars默认的严格模式会拒绝访问这类实例的非自身属性(即通过原型链或getter访问的属性)。 - 模板变量引用冗余:模板中
{{this.user.username}}的写法存在冗余,易引发上下文混淆。
具体修复步骤
1. 转换Mongoose文档为普通对象
在登录函数中,将查询到的user转换为普通JS对象,确保Handlebars能正常访问其属性。修改res.render的参数:
res.render('myPage',{ title: 'list', user: user.toObject() // 转换为普通对象 });
toObject()是Mongoose内置方法,会把文档实例转为包含所有schema定义属性的普通对象,让这些属性成为对象的自身属性。
2. 简化模板变量引用
修改HTML模板的变量写法,去掉冗余的this,或用{{#with}}切换上下文,让代码更清晰:
写法一:直接引用
<div class="container"> {{#if user}} <p>{{user.username}}</p> {{else}} <p>Error</p> {{/if}} </div>
写法二:使用{{#with}}切换上下文
<div class="container"> {{#with user}} <p>{{username}}</p> {{else}} <p>Error</p> {{/with}} </div>
{{#with user}}会将当前上下文切换到user对象,直接写{{username}}即可访问属性,代码更简洁。
内容的提问来源于stack exchange,提问作者Alex Dalen
相关产品推荐
相关产品推荐

