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

如何在EJS模板中实现数据增减操作?附Mongoose Schema代码

在EJS模板中实现数据减法的解决方案

嘿,我来帮你搞定这个问题~其实在EJS里做数据减法并不复杂,咱们一步步来:

一、先确保数据能传到EJS模板

首先得把Mongoose查询到的库存数据正确传递给模板,先完善你的路由代码:

router.get("/", async (req, res)=>{
  try {
    // 查询所有库存数据
    const inventories = await Inventory.find({});
    // 把数据传给EJS模板(假设你的模板文件叫inventory.ejs)
    res.render("inventory", { inventories });
  } catch (err) {
    console.error("查询数据出错:", err);
    res.status(500).send("服务器出错啦");
  }
});

二、直接在EJS模板里做减法操作

EJS支持在模板标签里直接写JavaScript算术表达式,不过要注意你的Schema里字段都是数组类型(比如quantity: [Number]),所以得取数组里的元素来计算,示例模板代码如下:

<!-- inventory.ejs 模板内容 -->
<div class="inventory-list">
  <% inventories.forEach(inventory => { %>
    <div class="inventory-item">
      <h4>商品名称: <%= inventory.name[0] %></h4>
      <p>原始库存: <%= inventory.quantity[0] %></p>
      <!-- 示例:计算减去3后的剩余库存 -->
      <p>剩余库存: <%= inventory.quantity[0] - 3 %></p>
      <!-- 示例:计算打9折后的价格,保留两位小数 -->
      <p>折扣价: <%= (inventory.price[0] * 0.9).toFixed(2) %></p>
    </div>
  <% }) %>
</div>

三、更优方案:后端预处理数据再传模板

如果减法逻辑比较复杂,或者不想让模板里堆太多计算代码,建议在路由里先处理好数据,再传给模板,这样模板更简洁易维护:

router.get("/", async (req, res)=>{
  try {
    const inventories = await Inventory.find({});
    // 预处理数据,提前计算好需要的结果
    const processedData = inventories.map(item => {
      // 把Mongoose文档转成普通对象
      const obj = item.toObject();
      // 自定义减法逻辑,这里示例减去5
      obj.remainingQty = obj.quantity[0] - 5;
      // 计算折扣价并保留两位小数
      obj.discountedPrice = (obj.price[0] * 0.9).toFixed(2);
      return obj;
    });
    res.render("inventory", { inventories: processedData });
  } catch (err) {
    console.error("查询数据出错:", err);
    res.status(500).send("服务器出错啦");
  }
});

之后模板里直接用预处理好的字段就行:

<div class="inventory-list">
  <% inventories.forEach(inventory => { %>
    <div class="inventory-item">
      <h4>商品名称: <%= inventory.name[0] %></h4>
      <p>剩余库存: <%= inventory.remainingQty %></p>
      <p>折扣价: <%= inventory.discountedPrice %></p>
    </div>
  <% }) %>
</div>

四、重要注意事项

  • 修正字段类型:你的Schema里把name、quantity、price都定义成了数组类型,这大概率不是你想要的,建议改成单个值的定义,避免每次都要写[0]取元素:
    var InventorySchema = Schema({
      name: {type: String, required: true, unique: true},
      quantity: Number,
      code: String,
      price: Number,
      stock: {type: Boolean, default: true}
    })
    
  • 避免NaN报错:做减法前可以加个判断,确保数值存在且有效:
    <p>剩余库存: <%= inventory.quantity && !isNaN(inventory.quantity) ? inventory.quantity - 3 : '数据缺失' %></p>
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:38:53