【问题标题】:Why won't ejs loop through/recognize my data pulled from the mongodb schema?为什么 ejs 不会循环/识别我从 mongodb 模式中提取的数据?
【发布时间】:2020-12-30 10:00:36
【问题描述】:

我正在尝试遍历我的产品数据库中的产品,并将每个产品作为自己的卡片显示在我的网站上。 db 包含 2 个项目,它们不会显示在页面上,但是,当我控制台记录它们时,这些项目会显示在控制台中。

这是我的控制器代码:

exports.getShop = (req, res, next) => {

Product.find(products => {
    res.render('shop/shop',{
        products: products,
        path:'/shop',
        pageTitle:'Shop'            
    })

})
.then(products => {
    console.log(products);
})
.catch(err => {
    console.log(err);
})}; 

这是我的 html/ejs:

<% if (products) { %>
                    <div class="grid">
                        <% for (let product of products) { %>
                            <article class="card product-item">
                                <header class="card__header">
                                    <h1 class="product__title">
                                        <%= product.title %>
                                    </h1>
                                </header>
                                <div class="card__image">
                                    <img src="/<%= product.image %>" alt="<%= product.title %>">
                                </div>
                                <div class="card__content">
                                    <h2 class="product__price">$
                                        <%= product.price %>
                                    </h2>
                                    <p class="product__description">
                                        <%= product.description %>
                                    </p>
                                </div>
                                
                            </article>
                        <% } %>
                    </div>
                    <% } else { %>
                        <h1>No Products Found!</h1>
                    <% } %>

就像我说的,控制台会在我的数据库中显示产品,但页面输出是“未找到产品!”如果我稍微更改代码,在“products.length”处加载页面时会出错

修改代码:

<% if (products.length > 0 ) { %>
                    <div class="grid">
                        <% for (let product of products) { %>

错误提示“无法读取 null 的属性”。

我在这里错过了什么?

【问题讨论】:

  • 您将产品发送到哪里的 HTML 文件?
  • 什么意思? `res.render('shop/shop', { ...products: products...} 应该可以被 ejs 读取,不是吗?
  • 哦,我明白了,错过了,愚蠢的我......

标签: node.js mongodb model-view-controller callback ejs


【解决方案1】:
Product.find(query).toArray().then(products => {
res.render('shop/shop',{
    products: products,
    path:'/shop',
    pageTitle:'Shop'            
})

问题在于 mongo node.js 驱动程序的 find 函数返回一个游标对象,因此要“承诺”它,您需要使用返回一个承诺的 .toArray() 函数。

【讨论】:

  • 在 .find(query) 方法中我输入什么作为查询?我想找到所有产品,然后遍历它们。当我把它留空时它不起作用,如果我输入 .find({}) 它说 .toArray() 不是一个函数
  • 好的,所以我使用了 .lean() 而不是 .toArray() 并且它有效。我猜 .lean() 方法返回普通对象而不是猫鼬文档。感谢您的帮助!
  • 很高兴听到。顺便说一句,你没有提到使用猫鼬。 mongoose find() 与 mongo nodejs 驱动程序 find() 不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
相关资源
最近更新 更多