Deno 是一种后起之秀的 JavaScript 运行时环境,其在 Node.js 的基础上做出了一些改进,比如支持 TypeScript、异步操作以及浏览器一样的 ES 模块化等等。而中间件(middleware)则是当下前端开发中一个非常重要的概念,可以帮助我们在应用程序中实现各种功能,如日志输出、性能监控、权限验证等等。在本篇文章中,我们将介绍如何在 Deno 中实现中间件。
基础概念
在开始之前,我们需要先了解一些基础概念。中间件是指在应用程序处理请求和响应时,对请求和响应进行一系列操作的函数。在 Node.js 中,我们通常使用 req
和 res
对象来完成这些操作,而在 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 服务器示例:
import { serve } from "https://deno.land/std/http/server.ts"; const server = serve({ port: 3000 }); console.log("Server is running at http://localhost:3000/"); for await (const req of server) { req.respond({ body: "Hello Deno!" }); }
在以上示例中,我们通过 serve()
方法创建了一个 HTTP 服务器,并通过 for await (const req of server)
循环来监听端口 3000 上的请求,并返回一个 “Hello Deno!” 的响应。这是一个最简单的 HTTP 服务器,实际上我们可以使用中间件对其进行更强大的扩展。
中间件函数通常接收两个参数
通常来说,中间件函数会接收两个参数,即 context
和 next
。context
包含了当前请求的相关信息,而 next
则是一个函数,用于将请求传递给下一个中间件。
中间件函数通常的形式是:
function middleware(context: Record<string, any>, next: Function): void { // 执行一些操作 // ... // 将请求传递给下一个中间件 return next(); }
以上是一个简单的中间件函数,该函数会在请求到达时输出 “Hello, middleware!”,并将请求传递给下一个中间件。
-- -------------------- ---- ------- -------- ------------------- -------------- ----- ----- ---------- ---- - ------------------- -------------- -- ------------ ------ ------- - ----- ------ - ------- ----- ---- --- ------------------- -- ------- -- ------------------------- --- ----- ------ --- -- ------- - ----- ------- - - -------- --- -- ----- ------------------- -- -- - ------------- ----- ------ ------ --- --- -
以上示例代码的作用是在收到请求时输出 “Hello, middleware!”,并将请求传递给下一个中间件,此时的下一个中间件就是返回 “Hello, Deno!” 的响应。
将多个中间件组合在一起
我们可以将多个中间件组合在一起,以实现更加复杂的功能。组合中间件函数的方法有很多种,这里我们使用链式调用的方式。
-- -------------------- ---- ------- ----- ---------- - ------- ------------ ---------- - --- ------ --------------- ---------- ---------- - ---------------------------------- ------ ----- - ------ ----- ------------ ----- ------------- - ----- -------- - ----- ------- -------- ------------- -- - ----- ---------- - ------------------------ -- ------------- ------- ----- ------------------- -- -- -------------- - ---- -- ----- ------------ - - ----- ----------- - --------- ---- ----- ---------- ---- -- - ------------------- --------------- ------- -- ----- ----------- - ----- --------- ---- ----- ---------- ------------- -- - ----- --- ----------------- -- ------------------- ------- ------------------- --------------- ------- -- ----- ------ - ------- ----- ---- --- ------------------- -- ------- -- ------------------------- ----- ---------- - --- ------------ ----------------- ------------------ --- ----- ------ --- -- ------- - ----- ------- - - -------- --- -- ----- ------------------------ ------------- ----- ------ ------ --- -
以上代码定义了一个 Middleware
类,其中 use()
方法用于添加中间件,而 run()
方法用于在收到请求时执行所有中间件。
同时我们定义了两个中间件函数,middleware1
和 middleware2
,前者用于输出 “Hello, middleware1!”,后者则使用了异步操作 setTimeout()
。
通过以上示例,我们可以看到当请求到达时,先依次执行所有添加的中间件,即输出 “Hello, middleware1!” 以及 “Hello, middleware2!”,然后才返回 “Hello, Deno!” 的响应。
总结
中间件是一个非常重要的概念,在前端开发中扮演着非常重要的角色。在 Deno 中,我们同样可以使用中间件来扩展我们的应用程序,实现各种功能。通过上面的例子,相信大家已经对 Deno 中实现中间件有了更加深入的了解,并且可以根据自己的需求来实现自己的中间件。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/645c7843968c7c53b0eda70c