You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NodeJS+EJS多页面渲染同ID商品(MySQL数据源)

解决方案

1. 重构商品数据获取逻辑(减少重复代码)

当前每个路由都新建数据库连接的方式既低效又冗余,先把商品数据获取逻辑抽成独立函数,同时改用数据库连接池优化性能:

// 在文件顶部初始化数据库连接池
const mysql = require('mysql');
const pool = mysql.createPool({
  host: process.env.HOST,
  user: process.env.USER,
  password: process.env.PASSWORD,
  database: process.env.DATABASE
});

// 封装获取商品数据的通用函数
function getProducts(callback) {
  pool.query('SELECT * FROM products', callback);
}

2. 给About和Services路由传递商品数据

修改路由配置,让/about和/services页面也调用上述函数获取商品数据,并传递给对应EJS模板:

// 首页路由(简化版)
app.get('/', function(req, res){
  getProducts(function(err, result){
    if(err) throw err;
    res.render('index', {result: result});
  });
});

// About页面路由
app.get('/about', function(req, res){
  getProducts(function(err, result){
    if(err) throw err;
    res.render('about', {result: result});
  });
});

// Services页面路由
app.get('/services', function(req, res){
  getProducts(function(err, result){
    if(err) throw err;
    res.render('services', {result: result});
  });
});

3. 复用EJS渲染代码(避免重复写循环)

把商品卡片的循环代码抽成EJS局部模板,比如创建views/partials/productList.ejs:

<% if(result && result.length > 0) { %>
  <% result.forEach(function(product){ %>
    <div class="product_card col-lg-3">
        <img src="images/<%= product.image %>">
        <div class="product_content">
            <p><%= product.name %></p>
            <h5>£<%= product.price %></h5>
            <a href="/singleproduct/<%= product.id %>" role="button">View</a>
        </div>
    </div>
  <% }) %>
<% } %>

之后在index.ejs、about.ejs、services.ejs需要展示商品的位置,直接引入这个局部模板即可:

<!-- 在页面对应位置插入 -->
<%- include('partials/productList') %>

核心说明

  • 商品ID完全不需要修改:所有页面渲染的都是数据库中原始的商品数据,跳转详情页的链接会自动沿用正确ID。
  • 连接池优化:相比每次新建连接,连接池能提升数据库操作的性能和稳定性。
  • 局部模板复用:后续修改商品卡片样式时,只需更新一个文件,维护成本更低。

内容的提问来源于stack exchange,提问作者PhilipA1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:12:59