如何在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_
相关产品推荐
相关产品推荐

