请求协助改造Express+Mongoose的findAll方法以适配Router渲染EJS
改造Express+Mongoose的Controller方法以支持页面渲染
1. 改造Controller中的findAll方法
原来的方法直接操作响应对象返回JSON,现在我们把它改成返回查询数据,同时用async/await处理异步查询:
// controllers/Form.Controller.js const Form = require('../models/Form'); // 引入你的Form模型 exports.findAll = async () => { try { // 用await等待Mongoose查询完成,拿到结果 const forms = await Form.find(); return forms; } catch (err) { // 抛出错误,让调用方(Router)处理错误响应 throw new Error(`查询表单失败: ${err.message}`); } };
2. 改造Router,调用方法并渲染页面
在Router中新增页面路由,调用改造后的findAll方法获取数据,再渲染index.ejs:
// routes/Form.Router.js const express = require('express'); const router = express.Router(); const formController = require('../controllers/Form.Controller'); // 渲染表单列表页面的路由 router.get('/', async (req, res) => { try { // 用await获取Controller返回的表单数据 const forms = await formController.findAll(); // 把数据传给ejs模板,渲染页面 res.render('index', { forms }); } catch (err) { // 捕获错误,返回500状态并渲染错误页(或直接返回错误信息) res.status(500).render('error', { errorMsg: err.message }); } }); // 保留原API路由(如果需要继续提供JSON接口) router.get('/api/forms', async (req, res) => { try { const forms = await formController.findAll(); res.status(200).json(forms); } catch (err) { res.status(500).json({ message: err.message }); } }); module.exports = router;
3. 在EJS模板中使用数据
在index.ejs里可以直接遍历传入的forms数据:
<!-- views/index.ejs --> <!DOCTYPE html> <html> <head> <title>表单列表</title> </head> <body> <h1>所有表单</h1> <div class="form-list"> <% if (forms.length > 0) { %> <% forms.forEach(form => { %> <div class="form-item"> <h3><%= form.name %></h3> <!-- 替换为你的Form模型字段 --> <p><%= form.description %></p> </div> <% }) %> <% } else { %> <p>暂无表单数据</p> <% } %> </div> </body> </html>
关键说明
async/await是Promise的语法糖,async标记的函数会返回Promise,内部用await等待异步操作完成。- Controller只负责数据查询逻辑,不处理响应,符合MVC的职责分离原则。
- 错误统一在Router层处理,避免Controller和响应对象耦合。
内容的提问来源于stack exchange,提问作者Jeremy Ragsdale
相关产品推荐
相关产品推荐

