在 Hapi.js 中,路由匹配是非常重要的一个概念。简单来说,路由匹配是指根据请求的地址和 HTTP 方法,将请求映射到相应的路由处理程序上,然后执行该处理程序。但路由匹配并不是一件简单的事情,因为它涉及到了众多因素,如:路由路径、HTTP 方法、路由参数等等。本文将对 Hapi.js 路由匹配规则进行详细的解析,并附上一些示例代码,希望能够帮助读者更好地理解和掌握。
路由路径匹配
Hapi.js 路由匹配规则中最基本也是最重要的一步就是路由路径的匹配。在 Hapi.js 中,路由路径可以是一个字符串形式的路径,也可以是一个正则表达式,而路由匹配器会根据路由路径中的参数和通配符来匹配相应的路由处理程序。
路由路径参数
在 Hapi.js 中,可以通过路由路径中的参数来匹配相应的路由处理程序。路由路径参数可以用占位符来表示,格式为 {param},其中 param 为参数名。例如,下面的路由路径 /users/{id} 中的 id 就是一个路由路径参数。
server.route({
method: 'GET',
path: '/users/{id}',
handler: (request, h) => {
return `User ${request.params.id}`;
}
});如果请求地址为 /users/123,则路由匹配器会将 123 作为 id 参数的值传递给相应的路由处理程序。
路由路径通配符
除了路由路径参数外,Hapi.js 还支持使用通配符来匹配路由路径。通配符主要有两种类型,分别是 * 通配符和 ? 通配符。
* 通配符可以匹配任意字符,包括斜杠 /。例如,下面的路由路径 /static/*filepath 中的 *filepath 就可以匹配所有以 /static/ 开头的请求地址。
server.route({
method: 'GET',
path: '/static/{filepath*}',
handler: (request, h) => {
return `Static file ${request.params.filepath}`;
}
});如果请求地址为 /static/js/main.js,则路由匹配器会将 js/main.js 作为 filepath 参数的值传递给相应的路由处理程序。
? 通配符只能匹配一个字符。例如,下面的路由路径 /foo/{bar?} 中的 bar? 就可以匹配 /foo/、/foo/a、/foo/b 等地址。
server.route({
method: 'GET',
path: '/foo/{bar?}',
handler: (request, h) => {
return `Bar ${request.params.bar}`;
}
});如果请求地址为 /foo/a,则路由匹配器会将 a 作为 bar 参数的值传递给相应的路由处理程序。
HTTP 方法匹配
除了路由路径的匹配外,Hapi.js 路由匹配规则还涉及到了 HTTP 方法的匹配。HTTP 方法可以通过在路由处理程序上使用 method 选项来指定,如果请求的 HTTP 方法与路由处理程序指定的方法不一致,则路由匹配器会返回 HTTP 404 错误。
server.route({
method: 'POST',
path: '/users',
handler: (request, h) => {
// 处理 POST 请求
}
});路由参数
Hapi.js 路由匹配规则还支持一些额外的参数来帮助更灵活地匹配路由,如:config、options、payload 等。
config 参数
config 参数可以用来指定路由的一些配置选项,如缓存控制、验证、插件等。例如,
-- -------------------- ---- -------
--------------
------- ------
----- --------------
------- -
------ -
---------- -- - ----
--
--------- -
------- -
--- -----------------------------
-
-
--
-------- --------- -- -- -
-- -- --- --
-
---上述代码中,config.cache 参数用来指定此路由的缓存选项,config.validate 参数用来指定对请求参数的验证选项。
options 参数
options 参数可以用来指定路由的一些其他选项,如错误处理、状态码等。例如,
-- -------------------- ---- -------
--------------
------- ------
----- --------------
-------- -
--------- -
------- -----
----------- ---
--
-- ----
------------- --------- -- ---- -- -
-- ----
-
--
-------- --------- -- -- -
-- -- --- --
-
---上述代码中,options.response 参数用来指定此路由的响应处理选项,options.errorHandler 参数用来指定此路由的错误处理函数。
payload 参数
payload 参数可以用来指定路由处理程序应该接收的有效负载的格式、大小限制等。例如,
-- -------------------- ---- -------
--------------
------- -------
----- ---------
-------- -
-------- -
------ -------------------- -------------------------------------
------ -----
------- -------
--------- -- - ---- - ----
-
--
-------- --------- -- -- -
-- -- ---- -------
-
---上述代码中,我们使用 payload.allow 参数来指定请求有效负载的 MIME 类型,payload.parse 参数用来指定是否将请求有效负载转换成 JavaScript 对象,payload.output 参数用来指定将有效负载转换成什么类型的数据格式,payload.maxBytes 参数用来指定上传有效负载的最大大小。
结语
到这里,我们对 Hapi.js 路由匹配规则进行的详细解析就结束了。希望通过本文的介绍,读者能够更好地理解和掌握 Hapi.js 路由匹配规则,对于实际项目的开发有更多的启示和指导。
Source: FunTeaLearn,Please indicate the source for reprints https://funteas.com/post/679752d2504e4ea9bde6e481