async/await写数据库查询的核心是让异步操作看似同步,提升可读性、错误处理与顺序控制;需封装为Promise函数、合理并发await、统一try/catch、手动管理事务。

用 async/await 写数据库查询,核心是把异步操作“看起来像同步”,让错误处理、顺序控制和可读性都更自然。关键不是堆语法,而是理清流程、统一错误边界、避免常见陷阱。
封装数据库调用为 Promise 函数
确保底层驱动(如 MySQL 的 mysql2/promise、PostgreSQL 的 pg、MongoDB 的 mongodb)已启用 Promise 支持。不要直接在 async 函数里写回调式查询。
- MySQL 示例:// 使用 mysql2/promise
import mysql from 'mysql2/promise';<br>const pool = mysql.createPool({ ... });<br><br>const queryUser = async (id) => {<br> const [rows] = await pool.execute('SELECT * FROM users WHERE id = ?', [id]);<br> return rows[0] || null;<br>}; - MongoDB 示例:// 假设已连接 client.db().collection()
const findUser = async (email) => {<br> return await usersCollection.findOne({ email });<br>};
按业务逻辑组织 await 链,避免过早 await
多个独立查询可并发执行,别一个接一个 await——那样是串行,白白拖慢响应。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ❌ 串行(慢):
const user = await findUser(id);<br>const posts = await findPostsByUserId(user.id);<br>const profile = await findProfile(user.profileId);
- ✅ 并发(快):
const [user, posts, profile] = await Promise.all([<br> findUser(id),<br> findPostsByUserId(id),<br> findProfile(user?.profileId)<br>]);
- 注意:若后一步依赖前一步结果(如
profileId来自user),就仍需分步await,但只在必要处等待。
统一错误处理:用 try/catch 包裹业务块,而非每个 await
不要给每个 await 单独加 try/catch,容易重复、遗漏,也破坏逻辑连贯性。把一整个业务单元(比如“创建订单+扣库存+发通知”)包进一个 try,集中处理失败场景。
立即学习“Java免费学习笔记(深入)”;
const createOrder = async (input) => {<br> try {<br> const user = await findUser(input.userId);<br> if (!user) throw new Error('用户不存在');<br> <br> const stock = await checkStock(input.productId, input.quantity);<br> if (!stock) throw new Error('库存不足');<br> <br> const order = await insertOrder({ ... });<br> await deductStock(input.productId, input.quantity);<br> await sendOrderNotification(order.id);<br> <br> return order;<br> } catch (err) {<br> // 统一记录日志、返回友好错误、必要时回滚<br> console.error('订单创建失败:', err);<br> throw new ApiError(400, '下单失败,请重试');<br> }<br>};
配合事务时,显式管理连接与 commit/rollback
async/await 不自动处理事务。必须手动获取连接、开启事务、捕获异常并决定回滚,最后释放连接。
const transferMoney = async (fromId, toId, amount) => {<br> const conn = await pool.getConnection();<br> try {<br> await conn.beginTransaction();<br> <br> await conn.execute('UPDATE accounts SET balance = balance - ? WHERE id = ?', [amount, fromId]);<br> await conn.execute('UPDATE accounts SET balance = balance + ? WHERE id = ?', [amount, toId]);<br> <br> await conn.commit();<br> return { success: true };<br> } catch (err) {<br> await conn.rollback();<br> throw err;<br> } finally {<br> conn.release(); // 关键:务必释放连接<br> }<br>};- 提示:可用工具库如
knex或prisma简化事务写法,但理解底层机制仍是写出健壮逻辑的前提。

















