mongoose Handlebar模板引擎循环问题

r1zk6ea1  于 2023-10-19  发布在  Go
关注(0)|答案(1)|浏览(106)

我想打印记录的用户ID,名称,电子邮件从后端使用hbs我使用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]}}时,它不会显示。它显示了第一个userdata,但为什么没有打印完整的值?帮帮我!!

fhg3lkii

fhg3lkii1#

这是因为默认情况下,在Handlebars >= v4.6.0中,运行时禁止访问上下文对象的原型属性和方法。Handlebars仍将在数组中循环,但将阻止它访问属性值。
你可以覆盖这个设置,你可以在这里阅读更多,但它的存在是为了保护你的系统免受恶意行为者试图利用安全漏洞,所以我建议你不要覆盖它。
正如用户@76484所提到的,mongoose有一个简单的lean()方法,你可以链接到任何你可能需要传递到你的搜索栏视图的查询。这将返回POJO,而不是Mongoose文档类的示例,因此可以在Handlebars视图中使用而不会遇到此问题。
默认情况下,Mongoose查询返回Mongoose Document类的示例。文档比普通的JavaScript对象要重得多,因为它们有很多内部状态用于更改跟踪。启用lean选项会告诉Mongoose跳过示例化完整的Mongoose文档,而只是给予POJO。
试试这个:

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

巧合的是,使用lean()将有加速应用程序的额外好处,因为:
在后台,在执行查询之后,Mongoose将查询结果从POJO转换为Mongoose文档。如果你打开了倾斜选项,Mongoose会跳过这一步。

相关问题