Handlebar 模板引擎循环问题

问题描述 投票:0回答:1

我想使用 hbs 从后端打印记录的用户 ID、姓名、电子邮件,我正在使用 MongoDB,但值没有打印,但循环正在工作。

<h1 class="display-1 text-center text-danger">WELCOME ADMIN</h1>

<table class="table">
  <thead>
    <tr>
      <th scope="col">#</th>
      <th scope="col">ID</th>
      <th scope="col">NAME</th>
      <th scope="col">EMAIL</th>
    </tr>
  </thead>
  <tbody>
    {{#each userArray}}
        <tr>
            <td>{{@key}}</td>
            <td>{{this._id}}</td>
            <td>{{this.name}}</td>
            <td>{{this.email}}</td>
        </tr>
        <script>
        
        var namee = {{this.name}}
        if (namee) {
        console.log("Name:", namee);
        }
    
        </script>
    {{/each}}
  </tbody>
</table> 

路由器:

var express = require('express');
var router = express.Router();
const userReg= require("../models/data")

router.get('/', async(req, res)=> {
 try{
  const userRegList = await userReg.find({});
  console.log("user count :"+userRegList.length);
  res.render('admin',{userArray:userRegList});
  console.log(userRegList)
 }catch(err){
  console.log(err);
 }
  });

  module.exports = router;

型号:

const mongoose = require("mongoose");

const personSchema=mongoose.Schema({
    name:String,
    email:String,
    password:String,
    repassword:String,
    birthday:Date,
    phonenumber:String,
    address:String 
});
var Person = mongoose.model("person",personSchema);
module.exports = Person//PersonalData

数据在控制台(console.log(userRegList))中正确打印,但未显示。当我在模板文件中使用 {{#each userArray.[0]}} 时,它会毫无失败地显示第一个用户数据,但为什么完整的值未打印。帮我解决这个问题!!

node.js express handlebars.js hbs
1个回答
0
投票

发生这种情况是因为,默认情况下,在 Handlebars >= v4.6.0 中,运行时禁止访问上下文对象的原型属性和方法。 Handlebars 仍将循环遍历数组,但它将被阻止访问属性值。

您可以覆盖此设置,您可以在此处阅读更多内容,但它是为了保护您的系统免受试图利用安全漏洞的恶意行为者的侵害,因此我建议您不要覆盖它。

正如用户 @76484 所提到的,mongoose 有一个简单的

lean()
方法,您可以链接到您可能需要传递到车把视图的任何查询。这将返回 POJO,而不是 Mongoose 文档类的实例,因此可以在 Handlebars 视图中使用,而不会遇到此问题。

默认情况下,Mongoose 查询返回 Mongoose Document 类的实例。文档比普通 JavaScript 对象重得多,因为它们有大量用于更改跟踪的内部状态。启用精益选项会告诉 Mongoose 跳过实例化完整的 Mongoose 文档,只为您提供 POJO。

试试这个:

const userRegList = await userReg.find({}).lean();

巧合的是,使用

lean()
将具有加快您的应用程序速度的额外好处,因为:

在底层,执行查询后,Mongoose 将查询结果从 POJO 转换为 Mongoose 文档。如果您打开精益选项,Mongoose 会跳过此步骤。

© www.soinside.com 2019 - 2024. All rights reserved.