Node.js:模型获取数据库数据后如何传递至控制器并实现控制器接收
解决模型数据传递到控制器并渲染视图的问题
嘿,我懂你现在的困惑——你的模型已经能从数据库拉取数据了,但就是没法把这些数据传递给控制器,最后也没法在视图里使用,对吧?咱们一步步调整代码就能搞定:
第一步:修改模型的fetchAll方法,让它返回数据
你原来的fetchAll只是在then里打印数据,没有把数据返回出去,控制器自然拿不到。我们需要让这个方法返回一个Promise,这样控制器就能通过异步方式接收数据:
方式一:用Promise链式调用
const db = require('../database'); module.exports = class User { fetchAll(){ // 直接返回db.execute的Promise,让控制器可以链式处理 return db.execute('SELECT * FROM users') .then(([rows, fieldData]) => { // 这里可以对数据做预处理,然后返回最终需要的rows return rows; }) .catch(err => { // 别忘了捕获错误,避免程序崩溃 console.error('获取用户数据失败:', err); throw err; // 把错误抛给控制器处理 }) } }
方式二:用async/await(更简洁直观)
const db = require('../database'); module.exports = class User { async fetchAll(){ try { // 用await等待数据库查询完成 const [rows, fieldData] = await db.execute('SELECT * FROM users'); return rows; } catch(err) { console.error('获取用户数据失败:', err); throw err; } } }
第二步:修改控制器的getIndex方法,接收数据并传给视图
因为fetchAll是异步操作,控制器必须等它完成后才能拿到数据,再渲染视图。这里同样有两种写法:
方式一:用async/await(推荐,代码更清晰)
const User = require('../model/user'); // 把函数改成async,这样就能用await exports.getIndex = async (req, res, next) => { try { const user = new User(); // 等待fetchAll返回数据 const users = await user.fetchAll(); // 把users作为模板变量传给index视图 res.render('index', { users: users }); } catch(err) { // 处理错误,比如交给错误中间件 console.error('控制器获取数据失败:', err); next(err); } };
方式二:用Promise的then链式调用
const User = require('../model/user'); exports.getIndex = (req, res, next) => { const user = new User(); user.fetchAll() .then(users => { // 拿到数据后再渲染视图 res.render('index', { users: users }); }) .catch(err => { console.error('控制器获取数据失败:', err); next(err); }); };
为什么原来的代码不生效?
你原来的代码里,res.render会在fetchAll的异步数据库查询完成之前就执行了,而且fetchAll没有返回任何数据,所以视图根本拿不到用户列表。异步操作必须等待它完成后再处理后续逻辑,这就是为什么我们需要用Promise、async/await或者then链式调用的原因。
内容的提问来源于stack exchange,提问作者Gourav Srivastava
相关产品推荐
相关产品推荐

