【问题标题】:How to dynamically create an EJS file from a database如何从数据库动态创建 EJS 文件
【发布时间】:2018-12-17 01:03:44
【问题描述】:

这里是新的网络开发人员;我正在使用 Mongo/Express/Node。

我正在尝试创建一个电子商务网站,管理员将在其中创建新的“类别”并将它们添加到数据库中。

每当向数据库添加一个新的“类别”时,我希望为该类别(以及数据库中的所有其他类别)创建一个新的 EJS 页面,然后加载所有属于该 EJS 页面中的该类别。

分类页面应符合模板;仅更改其名称和加载到其中的产品。

类似这样的:

<html>
    <body>
        <nav>
            <h2>Categories</h2>
            <div class="menu">
                <a>Men</a>
                <a>Women</a>
                <a>Children</a>
            </div>
        </nav>

        <% products.forEach(function(product) { %>
            <% if (product.category === x) { %>
                <h5><%= product.name %></h5>
                <img src='someurl'>
            <% } %>
        <% }) %>
    </body>
</html>

谢谢。

【问题讨论】:

    标签: mongodb express mongoose routing ejs


    【解决方案1】:

    幸运的是,您不需要动态创建 EJS 文件。您可以使用parameterised route matching,然后在 EJS 页面的渲染函数中返回该类别的正确数据。这就是使用动态网页的美妙之处!

    server.js
    const express = require("express");
    const app = express();
    
    app.get("/example/:category", (req, res) => {
        let { category } = req.params;
        let products = /* search db for category that matches that "category" var */;
        res.render("products.ejs", { products });
    });
    
    products.ejs
    ...
    <% products.forEach(product => { %>
        <h5><%= product.name %></h5>
        <img src="<%= product.imageURL %>">
    <% }); %>
    ...
    

    例如,如果用户访问/example/food,则category 变量参数将等于"food"。然后,您可以将其传递给 EJS 渲染函数。

    【讨论】:

    • 非常感谢 Sam,我认为这会奏效,很快就会尝试。