Ошибка ссылки : продукты не определены

#javascript #node.js #mongodb #express #mongoose

Вопрос:

Я работаю над интернет-магазином, в то время как я пытаюсь получить товары из MongoDB, его возвращаемые товары не определены, я использую ejs в качестве движка шаблонов.

 <%- include('parts/header') %>
<%- include('parts/navbar') %>

<div class="container">
    <div class="row">
        <% for(let product of products) { %> 
        <div class="col col-12 col-md-6 col-lg-4 col-xl-3">
            <div class="card" style="width: 18rem;">
                <img src="<%= product.image%> " class="card-img-top">
                <div class="card-body">
                  <h5 class="card-title">
                      <a href="/product/<%= product._id%>"><%= product.name%>></a>
                      <p>Price: <%= product.price %>

lt;/p>
</h5>
<form action="/cart" method="POST">
<input type="number" name="amount" class="from-control">
<input type="submit" value="Add to cart" class="btn btn-primary">
</form>
</div>
</div>
</div>
<% } %>
</div>
</div>
<%- include('parts/footer') %>

app.js

 const express = require('express');
const path = require('path');
const homeRouter = require('./routes/home.route');
const app = express();

app.use(express.static(path.join(__dirname, 'assets')));
app.use(express.static(path.join(__dirname, 'images')));

app.set('view engine', 'ejs');
app.set('views', 'views') //default

app.get('/', (req, res) => {
    res.render('index')
})

app.use('/', homeRouter)
app.listen(3000, () => {
    console.log('server listen to port 3000')
})
 

продукты.модель

 const mongoose = require('mongoose');

const DB_URL = 'mongodb://localhost:27017/online-shop';

const productSchema = mongoose.Schema({
    name: String,
    image: String,
    price: Number,
    description: String,
    category: String
})

const Product = mongoose.model('product', productSchema)


exports.getAllProducts = () => {
    //connect to db
    //get products 
    //disconnect

        return new Promise((resolve, reject) => {
            mongoose.connect(DB_URL).then(() => {
                return Product.find({})
            }).then(products => {
                    mongoose.disconnect()
                    resolve(products)
                }).catch(err => reject(err))
            })
        
    
}
 

home.controller

 const productsModel = require('../models/products.model')
exports.getHome = (req, res, next) => {
    //get products
    //render index.ejs
    productsModel.getAllProducts().then(products => {
        res.render('index', {
            products: products
        })
    })
}
 

the result

ReferenceError: D:programmingOnlineShopviewsindex.ejs:6
4|

 5|     <div class="row">
 

6| <% for(let product of products) { %>

 7|         <div class="col col-12 col-md-6 col-lg-4 col-xl-3">

8|             <div class="card" style="width: 18rem;">

9|                 <img src="<%= product.image%> " class="card-img-top">
 

продукты не определены
при оценке (оценка при компиляции (D:programmingOnlineShopnode_modulesejslibejs.js:662:12), :16:27)
в индексе (D:programmingOnlineShopnode_modulesejslibejs.js:692:17)
в tryHandleCache (D:programmingOnlineShopnode_modulesejslibejs.js:272:36)
в файле View.exports.RenderFile [в качестве движка] (D:programmingOnlineShopnode_modulesejslibejs.js:489:10)
при просмотре.визуализация (D:programmingOnlineShopnode_modulesexpresslibview.js:135:8)
в tryRender (D:programmingOnlineShopnode_modulesexpresslibapplication.js:640:10)
в функции.визуализация (D:programmingOnlineShopnode_modulesexpresslibapplication.js:592:3)
при ответе сервера.визуализация (D:programmingOnlineShopnode_modulesexpresslibresponse.js:1012:7)
в D:programmingOnlineShopapp.js:13:9
на уровне.ручка [как handle_request] (D:programmingOnlineShopnode_modulesexpresslibrouterlayer.js:95:5)
на следующем (D:programmingOnlineShopnode_modulesexpresslibrouterroute.js:137:13)
на маршруте.отправка (D:programmingOnlineShopnode_modulesexpresslibrouterroute.js:112:3)
на уровне.ручка [как handle_request] (D:programmingOnlineShopnode_modulesexpresslibrouterlayer.js:95:5)
в D:programmingOnlineShopnode_modulesexpresslibrouterindex.js:281:22
на Работе.параметры процесса (D:programmingOnlineShopnode_modulesexpresslibrouterindex.js:335:12)
в следующий (D:programmingOnlineShopnode_modulesexpresslibrouterindex.js:275:10)

Комментарии:

1. Я бы попытался отладить на home.controller непосредственно перед тем, как res.renderer проверит, что вы получаете в продуктах

Ответ №1:

Я думаю, что это происходит потому, что либо ваша база данных пуста, либо ваша база данных не может отправлять данные. попробуйте использовать

 <% if(products)  {%>

<% } %>
 

перед циклом в index.js файл.