【问题标题】:Mongodb find elementMongoDB查找元素
【发布时间】:2021-10-28 15:31:37
【问题描述】:

我有一个循环,在每个元素旁边的表格中显示所有元素(产品)当我单击它时有一个编辑按钮,它应该将我重定向到编辑页面并显示所选元素的标题(产品)。但是,当它重定向我时,它会显示一个错误(“无法读取 null 的属性 'title')。

product.js

.
.
const mngoose = require("mongoose")

const productSchema = new mngoose.Schema({

    title:{
    type: String,
    required: true
    },

    description: {
        type: String,
        required: true
    }
})

let Product = mngoose.model('Product', productSchema, 'products');
module.exports = Product;

admin-routes.js

  .
    .
    router.get('/showProducts', (req, res) => {
        Product.find({},{},(err,products)=>{        
            let chunk = []
            let chunkSize = 3
            for(let i=0; i<products.length; i+=chunkSize){
                chunk.push(products.slice(i, chunkSize+i))
            }
            res.render('admin/showProducts', {
                chunk: chunk,
                message: req.flash('info'),
            })
         })
    })
    
    
    router.get('/edit', (req, res) => {
        Product.findOne({_id: req.params.id}, (err,product)=>{
            if(!err){
        res.render('admin/edit', {
            product: product
        })
    }
    })
    })
    .
    .

showProducts.ejs

.
.
.
<tbody>
        <% chunk.forEach((products)=>{%> 
      <tr>
        <% products.forEach((product)=>{%> 

        <th scope="row">1</th>
        <td><%= product.title %></td>
       
        <td> <a class="btn btn-primary"
          href="<%=  '/shopAdmin/edit'%>" role="button">Edit</a> </td> 
      </tr>

    </tbody>
    <%})%>
    <%})%>

edit.ejs

<%= product.title %>

错误信息:

【问题讨论】:

  • 能否提供console.log(product)?
  • 我添加了截图
  • 你能在admin-routes.js 之后forres.render 之前添加console.log 吗?

标签: node.js mongodb ejs


【解决方案1】:

我不确定你为什么使用块。可以这样简单定义-

router.get('/showProducts', async (req, res) => {
    const products = await Product.find();
    res.render('admin/showProducts', {
        products: products,
        message: req.flash('info'),
    })
})

在 EJS 模板中你可以渲染产品

 <% products.forEach((product)=>{%> 
  <tr>
    <th scope="row">1</th>
    <td><%= product.title %></td>
    <td> <a class="btn btn-primary"
      href="/shopAdmin/edit/<℅=product.id%>" role="button">Edit</a> </td> 
  </tr>
 <% }) %>

已编辑 -

您还必须更新编辑路线

router.get('shopAdmin/edit/:id', (req, res) => {
  Product.findOne({ _id: req.params.id }, (err, product) => {
    if (!err) {
      res.render('admin/edit', {
        product: product,
      });
    }
  });
});

【讨论】:

  • 没问题我可以解决这个问题,但我的主要问题是当我点击编辑时,我希望它把我重定向到显示所选产品标题和该产品描述等的编辑页面,就像您访问购物网站并单击产品一样,它会打开一个包含该产品所有信息的页面。
  • 那你得再做一个api来获取signle页面数据
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-25
  • 2021-08-27
  • 1970-01-01
相关资源
最近更新 更多