使用mysql2+Express查询MySQL返回连接对象而非目标数据的问题
解决Express+mysql2异步查询无法获取数据库数据的问题
核心问题是mysql2的query方法是异步操作,直接返回它的调用结果,拿到的是数据库查询/连接对象,而非实际的表记录数据。以下是具体修复方案:
方案1:使用mysql2/promise(推荐,代码更简洁)
1. 改造数据查询函数
改用mysql2的Promise版本,用连接池管理数据库连接,封装异步查询:
const mysql = require('mysql2/promise'); // 创建数据库连接池(比单连接更稳定高效) const pool = mysql.createPool({ host: '你的数据库地址', user: '数据库用户名', password: '数据库密码', database: '目标数据库名' }); async function getUnits() { try { // 执行查询,解构获取结果集 const [rows] = await pool.query('SELECT * FROM dutylogs'); // 替换为你的实际查询语句 return rows; // 返回结构化的表记录数组 } catch (err) { console.error('查询失败:', err); throw err; // 抛出错误交由路由处理 } } module.exports = { getUnits };
2. 路由中使用async/await处理异步逻辑
因为getUnits是异步函数,路由回调也要用async修饰,通过await等待查询结果:
const express = require('express'); const router = express.Router(); const { getUnits } = require('./你的数据模块路径'); router.get('/dutylogs', async (req, res) => { try { const dutyData = await getUnits(); // 将查询到的数据传给EJS模板渲染 res.render('dutylogs', { logs: dutyData }); } catch (err) { res.status(500).send('获取值班日志失败'); } }); module.exports = router;
方案2:传统回调方式兼容改造
如果不想用Promise,也可以用回调函数处理异步查询:
1. 改造查询函数
const mysql = require('mysql2'); const connection = mysql.createConnection({ host: '你的数据库地址', user: '数据库用户名', password: '数据库密码', database: '目标数据库名' }); function getUnits(callback) { connection.query('SELECT * FROM dutylogs', (err, rows) => { if (err) { callback(err, null); return; } callback(null, rows); }); } module.exports = { getUnits };
2. 路由中处理回调
router.get('/dutylogs', (req, res) => { getUnits((err, dutyData) => { if (err) { return res.status(500).send('获取值班日志失败'); } res.render('dutylogs', { logs: dutyData }); }); });
关键说明
之前的代码错误在于直接返回sql.query()的调用结果——这个方法是异步的,它不会立即返回查询数据,而是返回一个查询操作对象(也就是你看到的"连接日志对象")。必须通过回调、Promise/async-await等异步处理方式,等待查询完成后才能拿到期望的结构化表记录。
内容的提问来源于stack exchange,提问作者TenCreator
相关产品推荐
相关产品推荐

