如何在MySQL操作中使用Promise的.then方法及async/await语法?
原生mysql模块默认采用回调风格API,不支持直接调用.then(),你可以通过两种方式实现Promise化,支持.then()和async/await语法:
方案1:手动封装Promise(无需额外依赖)
第一步:修改db文件的getAll方法
直接返回Promise实例,在回调中处理成功/失败状态:
module.exports.reqMethods = { // GET All Cow Info getAll: function () { return new Promise((resolve, reject) => { connection.query('SELECT * FROM cows;', (err, data) => { if (err) return reject(err) console.log("DATA: \n", data) resolve(data) }) }) } }
第二步:修改服务端调用逻辑
方式A:.then() + .catch() 写法
app.get('/api/cows', (req, res) => { db.reqMethods.getAll() .then(data => res.send(data)) .catch(() => res.send('Error')) })
方式B:async/await 写法(更简洁)
app.get('/api/cows', async (req, res) => { try { const data = await db.reqMethods.getAll() res.send(data) } catch (err) { res.send('Error') } })
方案2:使用mysql2模块(原生支持Promise,推荐生产环境使用)
mysql2是兼容mysqlAPI的增强版本,自带Promise支持,无需手动封装:
- 安装依赖
npm install mysql2 - 修改db文件配置
// 引入mysql2的Promise版本 const mysql = require('mysql2/promise'); // 推荐使用连接池,性能优于单连接 const pool = mysql.createPool({ host: 'localhost', user: 'root', password: 'password', database: 'cowlist', connectionLimit: 10 // 连接池最大连接数 }); module.exports.reqMethods = { // 直接返回query结果,本身就是Promise实例 getAll: async function () { const [data] = await pool.query('SELECT * FROM cows;') return data } }
服务端调用逻辑和方案1完全一致。
内容的提问来源于stack exchange,提问作者Ronny Fitzgerald
相关产品推荐
相关产品推荐

