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

如何在Node.js中为MySQL查询函数实现Promise并用于页面渲染

把回调函数改造为Promise并实现页面渲染

没问题,我来帮你把原来的回调风格函数改成Promise,这样就能在控制器里异步获取数据并渲染页面了,分两步操作:

1. 改造 /models/profile.js 中的 getDataProfil 函数

我们需要把原来基于回调的connection.query包装成Promise,让函数返回一个Promise对象,这样就能用.then()或者async/await来处理结果:

module.exports = {
  getDataProfil: function(id_user) {
    // 返回一个Promise实例
    return new Promise((resolve, reject) => {
      connection.query("SELECT * FROM user WHERE id_user = ?", [id_user], function(err, rows, fields) {
        if (err) {
          // 如果查询出错,将错误传递给reject
          reject(err);
        } else {
          // 查询成功,将用户数据(rows[0])传递给resolve
          resolve(rows[0]);
        }
      });
    });
  }
}

2. 改造 /controllers/profile.js 中的调用逻辑

现在getDataProfil已经返回Promise了,我们可以用更清晰的async/await语法来获取数据,然后渲染页面;当然也可以用.then()链式调用,两种方式都给你列出来:

方式一:使用 async/await(推荐,代码更易读)

// 先确保你已经导入了profile模型
const profile_model = require('../models/profile');

module.exports.profil_get = async function(req, res, next) {
  try {
    // 等待Promise完成,获取用户数据
    const userProfile = await profile_model.getDataProfil(req.user.id_user);
    // 渲染页面,把用户数据传递给模板(这里假设你的模板叫'profile')
    res.render('profile', { user: userProfile });
  } catch (err) {
    // 捕获错误,传递给Express的错误处理中间件
    next(err);
    // 或者你也可以自己处理错误,比如:
    // res.status(500).render('error', { message: '获取用户信息失败' });
  }
}

方式二:使用 .then() 链式调用

如果你更习惯这种写法,也可以这样:

const profile_model = require('../models/profile');

module.exports.profil_get = function(req, res, next) {
  profile_model.getDataProfil(req.user.id_user)
    .then(userProfile => {
      // 拿到数据后渲染页面
      res.render('profile', { user: userProfile });
    })
    .catch(err => {
      // 处理错误
      next(err);
    });
}

这样改造后,你就能在获取到用户数据后,顺利渲染对应的页面了。需要注意的是,一定要处理错误,避免未捕获的Promise异常导致程序崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:43:24