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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 23:04:11