如何在路由中从Mongoose多Schema模型获取数据并渲染至UI?
从Mongoose多集合获取数据并渲染到UI的解决方案
嘿,我来帮你搞定这个问题!首先得确认几个关键点:你有三个独立集合test_working1/2/3,要通过路由匹配文件夹名称来拉取对应数据,对吧?那咱们一步步来:
第一步:确保模型和集合正确绑定
默认情况下,Mongoose会把模型名转成复数作为集合名,但你的集合是自定义命名的test_working1这类,所以得显式指定集合名。如果三个集合结构一样,咱们可以共用一个Schema,导出三个模型:
// models/test.js const mongoose = require('mongoose'); // 先定义你的Schema结构,根据你JSON文件里的字段来写 const testSchema = new mongoose.Schema({ // 举个例子,比如你的JSON里有title、content字段 title: String, content: String, // 其他字段... }); // 分别导出对应三个集合的模型 module.exports = { TestWorking1: mongoose.model('TestWorking1', testSchema, 'test_working1'), TestWorking2: mongoose.model('TestWorking2', testSchema, 'test_working2'), TestWorking3: mongoose.model('TestWorking3', testSchema, 'test_working3') };
要是三个集合结构不一样,那得分别写三个独立的Schema哦!
第二步:路由中动态匹配集合并查询数据
接下来在路由里,根据请求的文件夹参数(比如路由是/data/:folder,:folder对应working1/2/3),映射到对应的模型,然后查询数据:
const express = require('express'); const router = express.Router(); // 导入刚才定义的三个模型 const { TestWorking1, TestWorking2, TestWorking3 } = require('../models/test'); // 处理文件夹名称匹配的路由 router.get('/data/:folder', async (req, res) => { try { // 做个映射表,把路由参数和模型对应起来 const folderToModel = { 'working1': TestWorking1, 'working2': TestWorking2, 'working3': TestWorking3 }; // 根据参数拿到对应的模型 const TargetModel = folderToModel[req.params.folder]; if (!TargetModel) { // 参数不对的话返回错误提示 return res.status(400).send('抱歉,这个文件夹不存在哦!'); } // 查询数据——这里可以根据你的需求修改,比如只查特定条件的 // 比如想查title包含"test"的:TargetModel.find({ title: /test/i }) const targetData = await TargetModel.find(); // 把数据传给UI模板渲染,这里假设你用EJS模板,模板文件名自己调整 res.render('data-page', { folderName: req.params.folder, data: targetData }); } catch (err) { console.error('查询出错啦:', err); res.status(500).send('服务器内部出错了,请稍后再试'); } }); module.exports = router;
第三步:在UI模板里渲染数据
最后就是把拿到的数据展示到页面上,比如用EJS模板的话,示例如下:
<!-- views/data-page.ejs --> <!DOCTYPE html> <html> <head> <title><%= folderName %>的数据</title> </head> <body> <h1>来自<%= folderName %>的内容</h1> <div class="data-list"> <% if (data.length === 0) { %> <p>这个文件夹里还没有数据哦</p> <% } else { %> <% data.forEach(item => { %> <div class="data-item"> <h3><%= item.title %></h3> <p><%= item.content %></p> <!-- 其他字段按需渲染 --> </div> <% }) %> <% } %> </div> </body> </html>
几个要注意的小细节
- 先确保你的MongoDB连接已经在主文件(比如app.js)里正确建立了:
mongoose.connect('mongodb://localhost:27017/你的数据库名') - 如果需要获取单条数据,把
find()改成findOne({ 条件 })就行 - 要是你的路由逻辑里还有其他文件夹比对的规则,可以调整
folderToModel的映射逻辑,或者加额外的判断
内容的提问来源于stack exchange,提问作者Mark White
相关产品推荐
相关产品推荐

