
在 Express.js 中使用 Handlebars 渲染 MongoDB 查询返回的嵌套数组(如 station.Fuel)时,常见错误是误用 this. 前缀导致模板无法显示数据;正确做法是在 {{#each}} 块内直接使用属性名(如 {{type}}),无需 this.。
在 express.js 中使用 handlebars 渲染 mongodb 查询返回的嵌套数组(如 `station.fuel`)时,常见错误是误用 `this.` 前缀导致模板无法显示数据;正确做法是在 `{{#each}}` 块内直接使用属性名(如 `{{type}}`),无需 `this.`。
当你在 Handlebars 模板中使用 {{#each station.Fuel}} 时,Handlebars 会自动将当前迭代项设为“上下文(context)”,即每个数组元素都会成为该块内的默认作用域。因此,你可直接通过 {{type}}、{{price}} 和 {{remaining}} 访问其属性,而 不需要 写成 {{this.type}} —— 后者反而可能因上下文解析异常或版本兼容性问题导致渲染失败。
✅ 正确写法(推荐):
{{#each station.Fuel}}
<h4>Type: {{type}}, Price: {{price}}, Remaining: {{remaining}}</h4>
{{/each}}
❌ 错误写法(不必要且易出错):
{{#each station.Fuel}}
<h4>Type: {{this.type}}, Price: {{this.price}}, Remaining: {{this.remaining}}</h4>
{{/each}}
? 小贴士:
this在 Handlebars 中仅在需要显式引用当前上下文(例如嵌套{{#if}}或调用 helper 时)才需使用;在{{#each}}的顶层属性访问中,它是冗余且不推荐的。
此外,请确保以下几点以排除其他潜在问题:
- ✅ 数据已成功传入模板:在路由中添加
console.log(stationData.Fuel)确认数组非空、结构正确(如示例中含两个燃料对象); - ✅ Handlebars 助手未被覆盖:检查是否意外注册了自定义
eachhelper,干扰原生行为; - ✅ 模板语法无拼写错误:
{{#each}}与{{/each}}必须严格配对,且标签内不可混用 HTML 注释(如<!-- -->包裹 Handlebars 语法会导致解析失败); - ✅ 避免空数组静默失败:若
station.Fuel可能为空,建议添加安全判断:{{#if station.Fuel.length}} {{#each station.Fuel}} <p>Fuel: {{type}} – ${{price}}/L ({{remaining}}L left)</p> {{/each}} {{else}} <p>No fuel data available.</p> {{/if}}
综上,修复核心问题只需删除 this. 前缀;结合数据校验与健壮性处理,即可稳定渲染任意嵌套数组内容。










