Node.js中替代async.waterfall方案及mysql2 Promise使用疑问
问题解答
1. 替代async.waterfall的方案
直接用顺序执行的await语句就能替代async.waterfall——waterfall的核心是串行执行依赖前序结果的任务,await天然支持这种串行流程,代码可读性比回调嵌套高得多。
如果任务间需要传递前序结果,直接把前一步的返回值赋值给变量,后续任务直接调用这个变量即可,完全不需要回调嵌套。
2. mysql2自带Promise后,无需手动处理Promise
mysql2的mysql2/promise模块已经原生支持Promise,不用再用util.promisify包装方法。直接引入这个模块,所有数据库操作(获取连接、执行查询等)都会返回Promise,直接用await调用就行。
重构后的示例代码
async function(req, res) { const dbquery = "select ....."; // 引入mysql2的promise模块 const mysql = require('mysql2/promise'); try { // 任务1:获取连接并执行查询 const connection = await mysql.createConnection({ host: '你的数据库主机', user: '数据库用户名', password: '数据库密码', database: '目标数据库名' }); const [product] = await connection.execute(dbquery); await connection.end(); // 释放连接 // 任务2:基于前序结果处理逻辑 const arg3 = `处理完成:共查询到${product.length}条数据`; // 示例业务逻辑 // 任务3:继续处理前序结果 const finalResult = `${arg3} completed`; console.log(finalResult); res.send(finalResult); } catch (err) { // 统一捕获所有异步错误,替代waterfall的错误回调 console.error(err); res.status(500).send('数据库操作失败'); } }
代码说明:
- 用
try/catch统一捕获所有异步操作的错误,替代原waterfall的最终错误回调 - 每个任务通过
await串行执行,前一步的结果直接传递给后续任务 - 使用
mysql2/promise的原生方法,无需手动做Promise转换
内容的提问来源于stack exchange,提问作者shumana chowdhury
相关产品推荐
相关产品推荐

