如何将Node.js中Express的router.get路由改写为普通async函数
Express路由转普通async函数实现方案
完全可以实现,核心改造思路是把路由中间件对req/res/next的依赖替换为「入参传值、返回值输出结果、同步顺序调用」的普通函数逻辑,具体操作步骤如下:
1. 拆分路由中的中间件逻辑
你给出的根路径/路由绑定了2个串联的异步中间件,/test路由绑定了1个异步中间件,我们可以逐个把每个中间件的业务逻辑抽成独立函数:
抽离第一个根路径中间件(生成pdf_data逻辑)
原逻辑是从请求中取参数生成data,挂载到req.pdf_data后调用next进入下一个中间件,改造后直接把需要的参数作为入参,返回生成的data即可:
async function generatePdfData(/* 这里填入该逻辑需要用到的参数,比如原逻辑从req.query/req.body/req.params中取的字段 */) { // 复制原代码中 "do some things and create data" 的逻辑 const data = /* 原逻辑生成data的代码 */ return data }
抽离第二个根路径中间件(处理pdf_data返回结果逻辑)
原逻辑是从req.pdf_data取值处理生成fa,调用res.send返回结果,改造后把pdfData作为入参,返回最终的fa即可:
async function processPdfData(pdfData) { // 复制原代码的逻辑 let pcount = pdfData.numpages; // 复制原代码中 "do more things" 的逻辑 const fa = /* 原逻辑生成fa的代码 */ return fa }
抽离/test路由逻辑
改造逻辑和上面一致,按需传入参数,返回最终结果即可:
async function handleTestLogic(/* 这里填入该逻辑需要用到的参数 */) { // 复制原代码中 "things are done" 的逻辑 const fa = /* 原逻辑生成fa的代码 */ return fa }
2. 组合串联逻辑(对应原路由的中间件串联效果)
原路由中next()的作用是按顺序调用下一个中间件,改造后直接按顺序调用前面抽好的函数,把前一个的返回值作为后一个的入参即可:
// 对应原根路径/路由的完整处理逻辑 async function handleRootLogic(/* 原逻辑需要从请求中获取的所有入参 */) { const pdfData = await generatePdfData(/* 传入对应参数 */) const result = await processPdfData(pdfData) // 如果需要返回响应头,可以和数据一起组装成对象返回,比如: // return { data: result, headers: { 'Content-Type': 'application/json' } } return result }
注意事项
- 原逻辑如果用到
req的任何属性(查询参数、请求体、路由参数等),全部改为函数入参传入,不需要依赖完整的req对象 - 原逻辑中
res.setHeader如果是通用响应配置(比如这里的JSON内容类型),不需要写到业务函数里,拿到函数返回值后再处理响应即可;如果是业务相关的自定义响应头,可以和业务数据组装成对象一起返回 - 原逻辑如果用
next(err)抛出错误,改造后直接用throw err抛错即可,调用函数时用try/catch捕获就能实现和原来一致的错误处理逻辑
内容的提问来源于stack exchange,提问作者tina
相关产品推荐
相关产品推荐

