前言
Koa 是一个优秀的 Node.js Web 框架,它有许多优秀的特性,比如非阻塞异步操作等。而这也让它变得越发流行。虽然 Koa 通过中间件的方式来扩展应用,但经常会遇到一些问题。比如我们在使用“koa-router”时经常会遇到一个错误 —— “koa-router not working with async await”。这个问题的解决方案就是本文要和大家分享的。
问题原因
我们都知道,在使用“koa-router”时,我们可以使用中间件的方式来处理路由。但是,如果你在中间件中使用了 async/await,你就会遇到一个错误提示: “koa-router not working with async/await”。原因是,Koa 框架对于 async/await 的处理方式和 Express 框架不同。它不会自动地把 Promise 包裹成一个中间件函数,而是把 promise 直接解析成 response,并放回给客户端了。
解决方案
- 利用 Koa 的洋葱模型,在中间件中使用 async/await 时,使用“await next();”等待后续中间件执行完成。如下代码:
-- -------------------- ---- ------- ----- --- - --------------- ----- ------ - ---------------------- ----- --- - --- ------ ----- ------ - --- --------- -------------------- ----- ----- ----- -- - -------------- -- -------- ----- ------- --- ---------------------- ----- ----- -- - ------ --- --------------- -- - -------------- -- ---------- ---------- --- --- ------------------------- ---------------- -- -- - ------------------- -- ------- -- ------------------------ ---
在上述代码中,我们在“/async”路由中使用 async/await,但是我们在 next() 方法之前加上了 await。这样就可以等待下一个中间件执行完成后再返回请求。
- 利用 koa-compose 中间件来实现自动加入 next() 方法。我们可以先使用 koa-compose 包装我们的中间件,然后再调用 app.use() 加入中间件。如下代码:
-- -------------------- ---- ------- ----- --- - --------------- ----- ------ - ---------------------- ----- ------- - ----------------------- ----- --- - --- ------ ----- ------ - --- --------- ----- ------------ - ----- ----- ----- -- - -------------- -- -------- ----- ------- -- ----- -------------- - -- -- - ------ --- --------------- -- - -------------- -- ---------- ---------- --- -- ----- ----------- - ---------------------- ----------------- --------------------- ------------------------- ---------------- -- -- - ------------------- -- ------- -- ------------------------ ---
在上述代码中,我们将中间件包装成一个数组,并使用 koa-compose 包装。这样提高了下一个中间件的执行顺序,且不需要我们自己手动加入 next() 方法。
总结
本文介绍了在 Koa 中怎么解决“koa-router not working with async await”问题,并给出了两种解决方案。当你在自己的项目中遇见这个问题时,你可以根据自己的实际情况选择哪种方案来解决。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651fa63095b1f8cacd72da82