Koa 框架学习:解决 “koa-router not working with async await” 问题

阅读时长 4 分钟读完

前言

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,并放回给客户端了。

解决方案

  1. 利用 Koa 的洋葱模型,在中间件中使用 async/await 时,使用“await next();”等待后续中间件执行完成。如下代码:
-- -------------------- ---- -------
----- --- - ---------------
----- ------ - ----------------------
----- --- - --- ------
----- ------ - --- ---------

-------------------- ----- ----- ----- -- -
  -------------- -- --------
  ----- -------
---

---------------------- ----- ----- -- -
  ------ --- --------------- -- -
    -------------- -- ----------
    ----------
  ---
---

-------------------------

---------------- -- -- -
  ------------------- -- ------- -- ------------------------
---

在上述代码中,我们在“/async”路由中使用 async/await,但是我们在 next() 方法之前加上了 await。这样就可以等待下一个中间件执行完成后再返回请求。

  1. 利用 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

纠错
反馈