#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.jsconst 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 файл.