如何对现有Node.js代码进行async await语法改造
async/await 改造方案
改造核心逻辑:将返回Promise的异步操作前加await,包裹await的函数声明为async,用try/catch替代原有的.catch错误捕获逻辑,同时可以移除冗余的手动Promise封装。
1. Express 路由接口改造
// 给路由回调函数加async声明 app.express.get('/api/member/logout', async function (request, response) { try { // await 等待异步方法返回结果 const result = await functionBal.logout(request.query.abc) if (result) { response.set('Content-Type', 'application/json'); response.status(200); response.json(result); } } catch (err) { // 捕获所有异步错误 response.set('Content-Type', 'application/json'); response.status(400); response.json("Error -- " + err); } });
2. 业务层log函数改造(原代码中调用functionDal.log的版本)
原代码中手动封装Promise属于冗余操作,内部调用的方法已经返回Promise,可以直接简化:
module.exports.log = async function (abc) { const result = await functionDal.log(abc) if (result) { return result } else { throw "Error" } };
3. 数据层MySQL操作log函数改造
同样移除冗余的手动Promise封装,直接用async/await简化链式调用:
module.exports.log = async function (abc) { // 等待获取数据库连接 const con = await mySqlConnection.connection() // 等待SQL执行完成 await con.query("UPDATE member SET table1 = 0 WHERE abc = ?", [abc]) return 'success' };
注意事项
- 实际项目中两个同名的
module.exports.log需要放在不同层级的文件中(比如业务层bal目录、数据层dal目录),避免后者覆盖前者 - Express的异步路由建议配合全局异步错误处理中间件使用,防止未捕获的异常导致服务挂死
内容的提问来源于stack exchange,提问作者vellai durai
相关产品推荐
相关产品推荐

