Hapi 是一个 Node.js 的服务器框架,用于构建可维护、可扩展、高度测试的应用程序。在 Hapi 应用中,请求和响应处理是非常重要的部分,我们需要了解相关知识点来编写高品质的 Hapi 应用。
请求处理
Hapi 应用中的请求处理包含以下几个方面:
路由配置
Hapi 应用通过路由配置来确定应用程序如何响应特定的请求。路由配置包括路由路径、HTTP 方法、处理程序等信息,可以使用 Joi 进行结构验证。
以下是 Hapi 应用中的一个路由配置例子:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ------ - ------------- ----- ----- ----- ----------- --- -------------- ------- ------ ----- ---------------- -------- --------- -- -- - ------ ------- --------------------------------------------- - --- ----- --------------- ------------------- ------- -- ---- -----------------
在这个例子中,我们为 GET
方法的 /hello/{name}
路径配置了一个处理程序,当用户请求这个路径时,应用程序会返回一个欢迎信息,其中包含用户提供的名称参数 name
。
请求对象
请求对象是每个传入 HTTP 请求所创建的对象,它包含与请求相关的所有信息,包括 URL、HTTP 方法、请求头、请求有效负载等。Hapi 请求对象除了 Node.js 核心 http.IncomingMessage
类提供的方法外,还提供了许多方便的扩展属性和方法,如 request.query
、request.payload
、request.state
等,用于访问请求参数、请求有效负载及 cookie、头信息等。
以下是 Hapi 请求对象的一些常用属性:
request.method
- HTTP 方法request.path
- 请求 URL 路径request.url
- 请求 URL 对象request.headers
- 请求头request.params
- 路径参数request.query
- 查询参数request.payload
- 请求有效负载request.state
- request 的 cookies
以下是 Hapi 请求对象的一些常用方法:
request.log()
- 记录请求信息request.is(['json', 'html'])
- 检查请求的 MIME 类型是否与提供的值匹配request.match()
- 检查路径与请求匹配的路由定义request.cookieAuth.test()
- 检查授权插件是否为路由启用
身份验证与授权
在 Hapi 应用中,身份验证和授权也是很重要的部分。Hapi 提供了一组功能强大的扩展点,用于在路由配置中指定身份验证和授权需求,并启用相应的插件来执行其操作。
以下是 Hapi 身份验证和授权配置的一个例子:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ------ - -------------------- ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ----- - - ----- - ----- ----- ----- --------- ------- --------- -------------------------------------------------------------- - -- ----- -------- - ----- --------- --------- --------- -- - ----- ---- - ---------------- -- ------- - ------ - ------------ ----- -------- ----- -- - ----- ------- - ----- ------------------------ --------------- ----- ----------- - - --- -------- ----- ---------- ------ -------- -- ------ - -------- ----------- -- -- ----- ---------------------------------------- ------------------------------ -------- - -------- --- ------------------------------ -------------- ------- ------ ----- ---- -------- ----------------- -- - ------ ------- -------- -- -------- - ----- - ----- ----------- ------ -------- - - --- ----- --------------- ------------------- ------- -- ---- -----------------
在这个例子中,我们设置了一个使用 bcrypt
哈希存储加密密码的用户列表和一个 validate
函数,该函数检查用户提供的用户名和密码是否正确。然后,我们通过 @hapi/basic
插件注册了一个基本的身份验证插件,并将其设置为默认策略。最后,我们在路由配置中指定了一个需要授权的路由,并配置了所需的作用域。
响应处理
Hapi 应用中的响应处理与请求处理的几个方面相对应,包括路由处理程序、响应对象和渲染视图等。
路由处理程序
路由处理程序是 Hapi 应用中用于处理特定请求的函数。在处理程序中,我们可以使用 h.response()
函数来创建一个新的响应对象,设置状态码、头信息以及有效载荷数据等。
以下是 Hapi 应用中一个处理程序的例子:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ------ - ------------- ----- ----- ----- ----------- --- -------------- ------- ------ ----- ---- -------- --------- -- -- - ------ ------------------ ---------------------------------- --------- - --- ----- --------------- ------------------- ------- -- ---- -----------------
在这个例子中,我们设置了一个简单的路由及处理程序,该处理程序返回一个新的响应对象,并设置了自定义头信息。
响应对象
响应对象是 Hapi 应用中响应请求的对象,包含响应状态码、头信息、有效负载等。与请求对象类似,Hapi 响应对象也提供了许多方便的扩展属性和方法,如 response.statusCode
、response.header
、response.type
等。
以下是 Hapi 响应对象的一些常用属性:
response.statusCode
- 响应状态码response.header()
- 添加响应头信息response.type()
- 设置响应内容类型response.encoding()
- 设置响应内容编码response.state()
- 设置响应 cookie
以下是 Hapi 响应对象的一些常用方法:
response.code()
- 设置状态码response.headers()
- 添加一组响应头信息response.type()
- 设置响应内容类型response.encoding()
- 设置响应内容编码response.state()
- 设置响应 cookie
渲染视图
Hapi 应用程序通常需要渲染 HTML 页面来呈现响应给用户。为此,Hapi 提供了一组视图渲染插件,允许我们为应用程序设置多个视图引擎,如 Handlebars、Pug 等。
以下是 Hapi 应用中一个使用 Handlebars 视图引擎的路由配置例子:
-- -------------------- ---- ------- ----- ---- - ---------------------- ----- ---------- - ---------------------- ----- ------ - ------------------------ ----- ------ - ------------- ----- ----- ----- ----------- --- ----- ------------------------ -------------- -------- - ---- ---------- -- ----------- ---------- ----- ------- --- -------------- ------- ------ ----- ---- -------- --------- -- -- - ------ --------------- - ------ ---------- -------- -------- -- ------ --- - --- ----- --------------- ------------------- ------- --- ---------------------
在这个例子中,我们在路由配置中注册了视图插件,在 server.views()
方法中设置了 Handlebars 引擎,指定了视图文件存储的路径,然后在一个 GET 路由处理程序中使用 h.view()
方法来呈现 HTML 视图,并传递数据到模板中。
结论
Hapi 应用中的请求和响应处理是非常重要的部分。在本文中,我们介绍了它们的一些关键方面,包括路由配置、请求对象、身份验证和授权、处理程序、响应对象和渲染视图等。通过深入了解它们,我们将能够编写更高品质和更可维护的 Hapi 应用程序。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66efdccd6fbf960197312295