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

Node.js+Express项目中如何将Mongoose查询数据渲染为前端下拉列表

步骤1:修改控制器,将查询到的数据传递给视图

你当前的控制器查询完数据后没有传给渲染的模板,先做如下调整:

require("../models/database");
const Category = require("../models/Category");

/**
 *  Get /
 * Homepage
 */

 exports.bike = async (req, res) => {
  try {
    Category.find({}).then((bike) => {
      // 如果Mongoose返回的数组结构和mock的bikeArray不一致,这里先处理成相同的嵌套对象结构
      const bikeData = JSON.parse(JSON.stringify(bike));
      res.render('./layouts/index', { bikeData }); // 把数据传给模板
    }).catch((e) => {
    console.log(e);
    })
    
  } catch (error) {
    res.status(500).send({ message: error.message || "Error Occured" });
  }
};

步骤2:在视图模板中把数据注入前端全局

在你的index模板(这里默认你用的是EJS模板引擎,其他引擎对应调整变量语法即可)中,加入如下代码,把后端传过来的数据挂载到window对象上,前端脚本可以直接读取:

<!-- 加在模板的head标签内,要在引入bike.js之前 -->
<script>
  window.bikeArray = <%- JSON.stringify(bikeData) %>;
</script>

步骤3:调整前端bike.js脚本

删掉开头引入静态mock数据的语句即可,你原有生成下拉列表的逻辑不需要做任何改动:

// 删掉这行:import  {bikeArray}  from './server/models/Category.js';

window.onload = function () {
  // 原有逻辑完全保留即可,window.bikeArray已经有对应数据
  var typSel = document.getElementById("typSel"),
  // ... 剩下的原有代码不变
}

注意事项

  • 需保证MongoDB中存储的Category数据结构和你原来mock.js里的bikeArray结构完全一致,如果Mongoose查询返回的是数组格式,需要先在控制器里把数组处理成和mock一致的嵌套对象结构,原有前端逻辑才能直接复用
  • 如果使用的模板引擎不是EJS,只需要对应调整模板中注入变量的语法,核心逻辑不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:45:00