Deno 中的中间件实现

阅读时长 6 分钟读完

Deno 是一种后起之秀的 JavaScript 运行时环境,其在 Node.js 的基础上做出了一些改进,比如支持 TypeScript、异步操作以及浏览器一样的 ES 模块化等等。而中间件(middleware)则是当下前端开发中一个非常重要的概念,可以帮助我们在应用程序中实现各种功能,如日志输出、性能监控、权限验证等等。在本篇文章中,我们将介绍如何在 Deno 中实现中间件。

基础概念

在开始之前,我们需要先了解一些基础概念。中间件是指在应用程序处理请求和响应时,对请求和响应进行一系列操作的函数。在 Node.js 中,我们通常使用 reqres 对象来完成这些操作,而在 Deno 中,则可以使用与 Node.js 相似的 context 对象。context 包含了一些常用的属性和方法,如下所示:

  • request:一个 Request 对象,表示客户端发来的请求。
  • respondWith(p: Promise<Response> | Response): void:一个方法,用于将响应传递给客户端。
  • throw(error: Error | string, status?: number): void:一个方法,用于抛出错误。
  • params:一个对象,保存了 URL 中的参数。
  • state:一个对象,用于在中间件之间共享数据。

实现

在 Deno 中,我们也可以使用 http 模块来实现 HTTP 服务器,并通过监听不同的端口来处理请求。下面是一个简单的 HTTP 服务器示例:

在以上示例中,我们通过 serve() 方法创建了一个 HTTP 服务器,并通过 for await (const req of server) 循环来监听端口 3000 上的请求,并返回一个 “Hello Deno!” 的响应。这是一个最简单的 HTTP 服务器,实际上我们可以使用中间件对其进行更强大的扩展。

中间件函数通常接收两个参数

通常来说,中间件函数会接收两个参数,即 contextnextcontext 包含了当前请求的相关信息,而 next 则是一个函数,用于将请求传递给下一个中间件。

中间件函数通常的形式是:

以上是一个简单的中间件函数,该函数会在请求到达时输出 “Hello, middleware!”,并将请求传递给下一个中间件。

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

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

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

以上示例代码的作用是在收到请求时输出 “Hello, middleware!”,并将请求传递给下一个中间件,此时的下一个中间件就是返回 “Hello, Deno!” 的响应。

将多个中间件组合在一起

我们可以将多个中间件组合在一起,以实现更加复杂的功能。组合中间件函数的方法有很多种,这里我们使用链式调用的方式。

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

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

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

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

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

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

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

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

以上代码定义了一个 Middleware 类,其中 use() 方法用于添加中间件,而 run() 方法用于在收到请求时执行所有中间件。

同时我们定义了两个中间件函数,middleware1middleware2,前者用于输出 “Hello, middleware1!”,后者则使用了异步操作 setTimeout()

通过以上示例,我们可以看到当请求到达时,先依次执行所有添加的中间件,即输出 “Hello, middleware1!” 以及 “Hello, middleware2!”,然后才返回 “Hello, Deno!” 的响应。

总结

中间件是一个非常重要的概念,在前端开发中扮演着非常重要的角色。在 Deno 中,我们同样可以使用中间件来扩展我们的应用程序,实现各种功能。通过上面的例子,相信大家已经对 Deno 中实现中间件有了更加深入的了解,并且可以根据自己的需求来实现自己的中间件。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645c7843968c7c53b0eda70c

纠错
反馈